Skocz do zawartości

[c++]Kolizja w allegro. Mapa kafelkowa


BaaTooN

Rekomendowane odpowiedzi

Witam, stworzyłem sobie mapę kafelkową i teraz chciałem dodać poruszającego się ludka, ale nie mam pojęcia jak zrobić kolizje... Znaczy wiem jak zrobic taką prosta na zasadzie if(ludek_x == sciana_x) itp.

Ale chciałem zrobic takie coś na mapie kafelkowej a nie chce do każdego obiektu na drodze ludka robić osobnej kolizji...

 

Chciałem zrobić to za pomocą funkcji: getpixel(...) ale nie wiem jaki podać tam kolor. Bo jak podam kolor bufora to ludek np. cały czas spada nawet jak napotka jakąś przeszkodę...

 

Proszę o szybką odpowiedź.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli mapa kafelkowa oznacza pojęcie tablicy 2d z wartością reprezentującą typ obiektu (np. 0 nic, 1 kolizja), to sposób jest prosty. Jeżeli każda z kafelek ma np. 16x16 pikseli, to x=floor(gracz_x/16) i otrzymujesz indeks (w tym przypadku poziomy) tablicy. Podobnie robisz z y, i otrzymujesz w ten sposób adres do komórki będącej "w" pozycji gracza. W taki sam sposób możemy sprawdzić co jest pod nim (dodajemy do y wartość 1), po lewo (x - 1), w prawo (x + 1), gdzieś (x + 3, y - 15), itd.

 

Skracając:

x = floor(gracz_x / 16);

y = floor(gracz_y / 16);

if tablica[x, y + 1] = 1 to znaczy że mamy coś pod sobą, na czym można stać (1 oznacza że komórka jest, em.. "twarda").

 

Grunt to "przerobienie" pozycji gostka na pozycję w tablicy.

Odnośnik do komentarza
Udostępnij na innych stronach

Właśnie o to mi chodzi, że jeżeli ludek dotyka obiektu to kolizja wynosi 1 a jeżeli nie dotyka to 0.

Tylko nie wiem jak odczytaj w jakiej pozycji znajduje się aktualnie ludek na tablicy...

 

 

PS: a nie dało by rady zrobić tego w ten sposób: http://www.easykoder.vot.pl/arty/wormsowamapa

tylko, że tam jest zwykła mapka a ja mam kafelkową...

Odnośnik do komentarza
Udostępnij na innych stronach

Ale co podzielić i przez co? x i y ludka?

Wolałbym tym sposobem co podałem w moim przez ostatnim poście (http://www.easykoder.vot.pl/arty/wormsowamapa ) tylko jak tak próbowałem zrobic to albo mam cały czarny ekran albo wyświetla mi normalnie moją mapke kafelkową i nic więcej

 

 

EDIT:

 

Exigo: w tym sposobie co wymieniłeś muszę wziąć tablicę tą co posiada mape czy zrobić nową na x,y??

Odnośnik do komentarza
Udostępnij na innych stronach

Najpierw określ się, czym jest dla ciebie mapa. Bo tak chaotycznie piszesz że już sam nie wiem co tam masz. Jeśli masz mapę w postaci tablicy, to czy:

a ) wartości jakie przyjmuje to 0 (jest to pusty "blok"), czy 1 - (kolidujący blok).

b ) wartości masz takie, aby obsługiwać jakiegoś tileseta (tzn. liczba reprezentuje grafikę którą chcesz rysować), czyli 0 - nic, 1 - trawa, 2 - kamienny blok, 3 - woda, etc. i potem na podstawie tego z czym mamy do czynienia dostosowujemy odpowiednie zachowania postaci, np. spadamy w dół, odbijamy się, pływamy, etc.

???

Odnośnik do komentarza
Udostępnij na innych stronach

Tylko, że ja mam pod 0 jakiś kafelek i tak aż do 15 (bo z tylu kafelków składa się nasza bitmapa) i jak chcce wyświetlić jakiś pusty kafelek to muszę wpisać więcej niż 15. I jakbyś mógł to wytłumacz mi dokładnie jak sprawdzić w jakim kafelku znajduje się nasz ludek.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, w takim razie zakładamy że masz tablicę w której trzymasz mapę, tak?

Dobra, tak opisowo:

 

Tak wyglądają nasze dane:

int x = 256, y =256, gracz_x = 33, gracz_y = 79, x2, y2, rozmiar_kafelki = 15;

int mapa[x][y] = {0}; (0 oznacza nic)

 

Teraz musisz przypisać komórkom jakieś wartości. Nie wiem jak to robisz, czy wczytujesz to jakoś z tekstu, czy bitmapy, może generujesz, nie wiem. Wszystko jedno. Zakładamy że w tej tablicy masz opisaną mapę. ; )

 

x2 = floor(gracz_x/rozmiar_kafelki); (czyli gracz jest np. na pozycji 215, to po przekształceniu 14,3333, co daje 14 - indeks komórki)

y2 = floor(gracz_y/rozmiar_kafelki);

 

I w ten sposób, liczby x2 i y2 to adres do komórki, która jest "na graczu". Na podstawie tego pobierasz sobie wartość, i liczysz kolizję na prawach fizyki jakie sobie tam wymyślisz. Komórka "pod graczem" to k = mapa[x2, y2 + 1];

Odnośnik do komentarza
Udostępnij na innych stronach

Okey zrobiłem tak jak podałeś i dałem sobię, żeby wyświetlało tak dla testu "numer kafelki..." i działa nawet dobrze ale nie o to mi chodziło ;d BO teraz jak poruszam się moim ludkiem po kafelce to co kafelka do mi dodaje 1... czyli jestem na kafelce ruszę się i numer kafelki zmienia się na 1 jeszcze dalej i mam 2 itp. A mi chodziło o to, żeby jak są te same kafelki żeby one miały ten są numer np.3

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...