Kolizje, mapa kafelkowa

0

Widok z góry, coś jak czołgi z pegasusa. Mapa składa się z kafli, które mogę sobie dowolnie układać.

Mam mapę, zapisaną w tablicy, reprezentującą typy kafli. Składa się ona z pustych kafli (0) oraz kafli z kolizją (> 0).
Każdy kafel ma wymiary 40px / 40px.

Mam także postać, która pojawia się w którymś pustym kaflu.
Postać ma również wymiary 40px / 40px.
Postać porusza się, pokonując jednorazowo 5px.

Mam funkcję, która porusza postacią w dowolną stronę, każdy ruch ma osobny warunek w funkcji, dzięki czemu można przesuwać jednocześnie w obu osiach.

Wszystko ładnie, ale nie mogę poradzić sobie z rzeczą najważniejszą - kolizjami.
Postać ma móc poruszać się po pustych kaflach, kolizja ma zachodzić po zetknięciu się z kaflem oznaczonym w tablicy liczbą większą od zera. Próbuję już któryś dzień z kolei, ciągle coś jest nie tak. Nie proszę o żadne gotowce, jedynie o wytłumaczenie, w jaki sposób owa kolizja ma działać, bo najwidoczniej moje pomysły są bez sensu...

0

Sprawdzaj kolizje AABB (odsyłam do google) z 9 kafelkami dookoła gracza.
Ewentualnie możesz uprościć do tego, aby sprawdzać z kafelkami tylko po stronie, w którą się poruszamy.

0

Tak właśnie próbowałem, w sensie z tym sprawdzaniem kafla obok, ale i tak coś mi nie idzie. Próbowałem z warunkiem, który sprawdza, czy po odjęciu 5px od danej pozycji postać znajdzie się na kaflu z kolizją, ale coś mi nie trybiło. Niby takie to łatwe, ale ja poległem...

0

właśnie wpadłem na ten post...może się Ci przyda jak ja to rozwiązałem:

 a= wielkość boku kafla
 kafel 0 to tło po którym chodzi sprit
 int sx,sy;// wsp. sprita
  int P,L,G,D,v=0;      // zmienne dla ruchu sprita
 while(...)
    {
  if( strzałka w prawo )&& kafle[sx/a+1][sy/a]   >0) P=1,L=0,G=0,D=0;
  if( strzałka w lewo   )&& kafle[sx/a-1][sy/a]   >0) L=1,P=0,G=0,D=0;
  if( strzałka w góre   )&& kafle[sx/a   ][sy/a-1]>0) G=1,D=0,P=0,L=0;
  if( strzałka w dół     )&& kafle[sx/a   ][sy/a+1]>0) D=1,G=0,P=0,L=0;
  if(P==1) ++v, ++sx; // w prawo
  if(L==1) ++v, --sx; // w lewo
  if(G==1) ++v, --sy; // w gore
  if(D==1) ++v, ++sy; // w dol
  if(v==a)v=0,P=0,L=0,G=0,D=0,ss=0;
  odświeżenie tła;
  wyświetlanie sprita sx,sy;

}

1

4p.png

0

Mozesz stworzyc dodatkowe 2 zmienne w ktorych bedziesz przechowywal pozycje gracza wedlug mapy kafelkowej.
Wtedy nawet nie trzeba petli. Wystarczy ze podstawisz do tablicy 2-wymiarowej gdzie przechowywane sa info. o mapie
pozycje gracza wdl. mapy kafelkowej i masz jeden warunek np if(map[pos_y][pos_x]>0) { tutaj nastompila kolizja }

0

Ja bym kombinował nieco inaczej;

Mając macierz z kafelkami i informacjami o ich przeznaczeniu (typu pusta - można na nią wjechać i "pełna", na którą wjechać nie można); Znane są ich rozmiary (40x40px), znany jest pojedynczy skok czołgu (5px), jak domniemam znana jest także jego pozycja na ekranie, więc pozostają jedynie banalne obliczenia;

Odbierasz komunikat, że gracz wskazał poruszenie czołgu, więc po pierwsze sprawdzasz wybrany przez gracza kierunek ruchu na podstawie typu wciśniętego klawisza;

Po drugie sprawdzasz, czy czołg dostawiony jest do ściany planszy, porównując jego pozycję X lub Y z współrzędnymi ściany planszy; Jeśli są równe, czyli czołg dotyka ściany - nie wykonujesz żadnej akcji i wychodzisz z funkcji;

Jeśli czołg znajduje się wewnątrz planszy, do zmiennej pomocniczej wpisujesz jego nowe koordynaty, dodając do odpowiedniej współrzędnej ilość pikseli skoku; Obliczasz teraz na kafli jakiego typu będzie stał czołg według nowych jego współrzędnych;

Jeśli kafla jest pusta, czyli można na nią wjechać, przepisujesz koordynaty ze zmiennej pomocniczej do głównej zmiennej pozycji i przerysowujesz czołg na ekranie; Jeśli kafla zawiera jakiś np. murek, czyli de facto nie można na nią wjechać, wychodzisz z funkcji i nic nie dalej nie robisz;

W teorii wygląda to banalnie, w praktyce to zwykła arytmetyka, trochę operacji modulo, macierze i zwykłe warunki bądź blok case czy tam switch.

1 użytkowników online, w tym zalogowanych: 0, gości: 1