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-0002ea33v1dcProszę o pomoc, i z góry dzięki. |
|
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 kolizjeTak 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 :) |
|
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. 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ę. |
|
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; } |
|
malpka321 Temat założony przez niniejszego użytkownika |
» 2009-06-28 12:44:16 działa napewno z wartościami =40 |
|
DejaVu |
» 2009-06-28 18:45:35 Wklej mi wtedy pełny kod, ale już poprawiony, który twierdzisz, że działa. Sprawdzę wtedy. |
|
malpka321 Temat założony przez niniejszego użytkownika |
» 2009-06-29 19:48:53 ludek.xl = ludek.x / 40; ludek.yl = ludek.y / 40;
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 |
|
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 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. |
|
« 1 » 2 |