Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro] Znów ta kolizja

Ostatnio zmodyfikowano 2009-07-03 13:17
Autor Wiadomość
malpka321
Temat założony przez niniejszego użytkownika
[Allegro] Znów ta kolizja
» 2009-06-26 21:49:28
Witam. Mam problem z wykryciem kolizji i reakcją na nią.
Ale zacznijmy od początku.
W mojej aplikacji wykorzystuje mapę kafelkową.
Mapę tą mam zapisaną w tablicy dwu-wymiarowej.
Każda kafelka jest rozmiarów 40x40 px.
Również postać jest tych samych wymiarów.
Do kolizji między postacią a mapą wykorzystuję (chyba) swój nowatorski xD sposób(który chyba nie jest prawidłowy)
Współrzędne ludzika dziele przez 40. Dzięki temu pozycja ludzika pokazuje na którym kaflu znajduje się ów postać.
Na początku programu sprawdzam  warunki kolizji postaci z mapką. Taki przykład:

if(( map[ ludek.xl + 1 ][ ludek.yl ] ) == 15 ) { grawitacja = false; } else { grawitacja = true; }

Później następuje reakcja na ten warunek.
.
Niestety coś robię źle, ponieważ postać nie wykrywa mi kolizji.

Nie wiem jak to dokładnie ując dlatego podaje link z którego można ściągnąć moją aplikacje.


http://www.przeklej.pl/plik/kolizja-zip-0002ea33v1dc


Proszę o pomoc, i z góry dzięki.
P-8062
DejaVu
» 2009-06-27 15:01:20
Pamiętam, że na forum były poruszane różne aspekty kolizji, w tym na mapie kafelkowej. Teraz nie mam czasu pogrzebać na forum żeby Ci to znaleźć, jednak spróbuj wykorzystać google w następujący sposób:
site:forum.ddt.pl mapa kolizje

Tak na wstępie tyle mogę Ci podać, żebyś miał jakiś punkt zaczepienia, jednak więcej informacji będę mógł udzielić dzisiaj wieczorem lub jutro :)
P-8072
malpka321
Temat założony przez niniejszego użytkownika
» 2009-06-27 21:52:04
ok naprawiłem wykrywanie kolizji i reakcje na nią wszystko dobrze działa.
Ale jest mały haczyk- działa ponieważ przemieszczam ludzika co 40 px, a chce go przemieszczać po 1 px.
C/C++
if(( map[ ludek.xl + 1 ][ ludek.yl ] ) == 15 ) { grawitacja = false; } else { grawitacja = true; }
if(( map[ ludek.xl ][ ludek.yl + 1 ] ) == 15 ) { mp = false; } else { mp = true; }
if(( map[ ludek.xl ][ ludek.yl - 1 ] ) == 15 ) { ml = false; } else { ml = true; }
if(( map[ ludek.xl ][ ludek.yl - 1 ] ) == 15 ) { mg = false; } else { mg = true; }


if( key[ KEY_LEFT ] &&( ml == true ) ) ludek.x -= 40;

if( key[ KEY_RIGHT ] &&( mp == true ) ) ludek.x += 40;

if( key[ KEY_UP ] &&( mg == true ) ) ludek.y -= 80;

if( grawitacja == true ) ludek.y += 40;


gdy zmienię aby przemieszczał się co 1 px to wykrywanie kolizji w lewo i grawitacja nie działają. Działa tylko wykrywanie kolizji na lewą stronę.
P-8076
DejaVu
» 2009-06-28 11:38:15
Tylko idąc w lewo nie działa kolizja?

/edit:
Mam poważne wątpliwości czy Ci działa dobrze z wartościami = 40, ponieważ w kodzie 'poprawionym' napisałeś:
if(( map[ ludek.xl ][ ludek.yl - 1 ] ) == 15 ) { ml = false; } else { ml = true; }
Moim zdaniem powinno być:
if(( map[ ludek.xl - 1 ][ ludek.yl ] ) == 15 ) { ml = false; } else { ml = true; }

P-8080
malpka321
Temat założony przez niniejszego użytkownika
» 2009-06-28 12:44:16
działa napewno z wartościami =40
P-8082
DejaVu
» 2009-06-28 18:45:35
Wklej mi wtedy pełny kod, ale już poprawiony, który twierdzisz, że działa. Sprawdzę wtedy.
P-8084
malpka321
Temat założony przez niniejszego użytkownika
» 2009-06-29 19:48:53
C/C++
ludek.xl = ludek.x / 40; ludek.yl = ludek.y / 40;
// Obsługa klawiatury
if(( map[ ludek.yl + 1 ][ ludek.xl ] ) == 15 ) { grawitacja = false; } else { grawitacja = true; }
if(( map[ ludek.yl ][ ludek.xl + 1 ] ) == 15 ) { mp = false; } else { mp = true; }
if(( map[ ludek.yl ][ ludek.xl - 1 ] ) == 15 ) { ml = false; } else { ml = true; }
if(( map[ ludek.yl - 1 ][ ludek.xl ] ) == 15 ) { mg = false; } else { mg = true; }


if( key[ KEY_LEFT ] &&( ml == true ) ) ludek.x -= 40;

if( key[ KEY_RIGHT ] &&( mp == true ) ) ludek.x += 40;

if( key[ KEY_UP ] &&( mg == true ) ) ludek.y -= 80;

if( grawitacja == true ) ludek.y += 40;

Tutaj jeszcze podaje link do plików źródłowych
http://www.przeklej.pl/plik/kolizja-zip-0002jo3fk40i
P-8097
DejaVu
» 2009-06-29 21:57:15
Cóż... postanowiłem Ci zrobić rysunek.
Czerwony kwadrat - ludek (w pozycji A i w pozycji B)
Zielone - obiekty kolizyjne
Niebieskie punkty - punkty, które uzyskujesz po wykonaniu operacji
C/C++
ludek.lx = ludek.x / 40;
ludek.ly = ludek.y / 40;
Różowe tło - pola zajmowane przez ludzika
Różowa obwódka - obszar, który powinien być sprawdzany czy jest kolizja.

W Twoim programie kolizja stwarza problem, ponieważ w wyniku dzielenia przez 40 uzyskujesz punkt, który przeskakuje co 40 kratek w osiach X i Y. W konsekwencji lekkie wejście na sąsiedni kwadrat powoduje przeskoczenie tego punktu w lewo o całe 40px. Następnie sprawdzasz czy jest kolizja kolejny kwadrat obok i w tym momencie ludek stanie Ci w nieporządanym miejscu.

Szczerze mówiąc nie wiem jak można prosto poprawić ten program, który masz tak aby działał prawidłowo i nie sprawiał problemów bez dopisywania funkcji do wykrywania kolizji prostokątów. Zastanawiać nad tym też  nie specjalnie mi się chce, więc pomyśl samodzielnie lub poczekaj aż ktoś inny coś napisze :) Rysunek powyższy powinien Ci znacząco pomóc w analizie Twojego problemu.
P-8099
« 1 » 2
  Strona 1 z 2 Następna strona