Wrzochu Temat założony przez niniejszego użytkownika |
[Allegro, C++] Kolizje » 2011-08-29 19:39:28 Witam, od dłuższego czasu nie mogę się uporać z problemem kolizji. Mam mapę kafelkową po której poruszają się "samochody", no i teraz jeżeli nie ruszam mapy to kolizje mi wykrywa i działa wszystko cacy... natomiast jak tylko zacznę nią ruszać kolizja jakby przestała działać.. Tutaj jak mapa nie ruszana : Tu jak tylko zacznę ruszać: Do sterowania mapą używam: if(( key[ KEY_RIGHT ] ) &&( mapa_x < 80 ) ) { mapa_x = mapa_x + 1; } else if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) ) { mapa_x = mapa_x - 1; } else if(( key[ KEY_DOWN ] ) &&( mapa_y < 90 ) ) { mapa_y = mapa_y + 1; } else if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }
A do wykrywania kolizji: if(( kierunek == 0 ) &&( getpixel( bufor,( autoo_x + 10 ) -( mapa_x * 20 ),( autoo_y5 ) -( mapa_y * 20 ) ) != makecol( 0, 0, 0 ) ) || (( kierunek == 1 ) &&( getpixel( bufor,( autoo_x + 25 ) -( mapa_x * 20 ),( autoo_y + 10 ) -( mapa_y * 20 ) ) != makecol( 0, 0, 0 ) ) ) || (( kierunek == 2 ) &&( getpixel( bufor,( autoo_x + 10 ) -( mapa_x * 20 ),( autoo_y + 25 ) -( mapa_y * 20 ) ) != makecol( 0, 0, 0 ) ) ) || (( kierunek == 3 ) &&( getpixel( bufor,( autoo_x - 5 ) -( mapa_x * 20 ),( autoo_y + 10 ) -( mapa_y * 20 ) ) != makecol( 0, 0, 0 ) ) ) )
Gdzie kierunek to w jaką stronę ma jechać samochód. Wydaje mi się, że problem może być z tym, że współrzędne auta są przesuwane po 1 pikselu a sterowanie mapy po 20... Bo tak mam w funkcji która wyświetla mape: void wys_mape() { int licznik_x, licznik_y; for( licznik_x = 0; licznik_x < 120; licznik_x++ ) { for( licznik_y = 0; licznik_y < 120; licznik_y++ ) { blit( teren, bufor, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 8 ) * 20, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 8 ) * 20, licznik_x * 20, licznik_y * 20, 20, 20 ); } } };
Ale już sam nie wiem, Mam nadzieje że jasno naświetliłem problem i, że komuś uda się mi pomóc, Z góry dzięki za wszelką pomoc. |
|
SeaMonster131 |
» 2011-08-29 23:17:28 Powiem szczerze, że nie mam pojęcia co źle jest, ale zauważyłem tylko, że brakuje Ci jednego nawiasu w if'ie. I z tego wywnioskowałem, że kolizja może działać jedynie kiedy kierunek jest równy 1. Tą pierwszą linijke w if'ie musisz dać w nawias, tak jak zrobiłeś to z pozostałymi. Nie wiem czy to coś da, ale wydaje mi sie, że to błąd ;) |
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-08-30 00:03:40 NO fakt przeoczyłem to, ale niestety niczego to nie zmienia i dalej nie działa to tak jak powinno :/ |
|
malan |
» 2011-08-30 00:10:41 Nie może tutaj zastosować kolizji dwóch prostokątów? if( pozycja_auta1_x >= pozycja_auta2_x && pozycja_auta1_x <= pozycja_auta2_x + szerokosc_auta_2 && pozycja_auta1_y >= pozycja_auta2_y && pozycja_auta1_y <= pozycja_auta2_y + wysokosc_auta_2 ) { switch( kierunek ) { } }
|
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-08-30 00:21:30 A jeśli obiektów jest bardzo dużo ? To mam wypisywać wszystkie możliwe kolizje ? |
|
lynx |
» 2011-08-30 00:25:20 do tego są tablice/ kontenery, klasy/struktury i pętla for. :)
w tablicy trzymasz obiekty wysztkie. Każdy obiekt ma swoje współrzędne na mapie. pętlą for lecisz po obiektach i sprawdzasz pomiędzy nimi kolizje.
Tak najprościej chyba.
Jak się wyćwiczysz to znajdziesz jakieś rozsądniejsze algorytmy do sprawdzania kolizji. :) narazie nie będę CI ich pisał, bo to jest bardziej skomplikowane niż to co Ci napisałem powyżej i mógłbyś mieć problem by to ogarnąć. :) poza tym niechce mi się tyle pisać. :P
/edit
a jeśli nie znasz klasy/struktur, tablic/kontenerów i pętli for. To zrobiłeś błąd biorąc się od razu za robienie gry, ale trzeba przyznać że dużo osób tak robi. :) |
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-08-30 00:28:39 Czyli ten mój "sposób" odpada i nic się z tym nie da zrobić ? Postaram się jeszcze trochę pomęczyć a jak nie wyjdzie będę kombinował z kolizjami 2 prostokątów. Dzięki za pomoc. |
|
lynx |
» 2011-08-30 00:30:41 Cóż jeśli nie chcesz dla każdej kolizji wklepywać danych ręcznie to nie ma innego wyjścia niż trzymać wszystkie obiekty w jakimś pojemniczku i sprawdzać automatycznie te kolizje przechodząc forem. :) |
|
« 1 » 2 3 |