[SFML 2.0] Dokładność kolizji na mapie kafelkowej
Ostatnio zmodyfikowano 2013-05-31 17:17
czosnek17 Temat założony przez niniejszego użytkownika |
[SFML 2.0] Dokładność kolizji na mapie kafelkowej » 2013-05-30 18:10:43 Mam mapę kafelkową i obrotową postać, tzn jest zwrócona w kierunku poruszania. W tym celu ustawiłem funkcję setOrigin() na środek postaci. Kolizje wykrywam tak: kafx = pozycja.x / 60; kafy = pozycja.y / 60; if( mapa[ kafx ][ kafy ].ckol == 1 ) cout << "KOLIZJA" << endl; Problem w tym, że kolizja jest wykrywana dopiero, gdy wjadę na klocek conajmniej połową postaci. Próbowałem zmieniać Origin postaci/dodawać liczby do pozycja.x i y w zależności od kierunku ruchu, ale nic działającego nie wymyśliłem :/ |
|
DanielSC |
» 2013-05-30 19:50:06 Sprawdzasz kolizje tylko dla środka postaci czyli tylko jednego punktu a potrzebujesz ich co najmniej cztery(punkty). Robisz to tak: Dajmy że środek postaci to x=100 a y=100 Teraz musisz obliczyć górny róg i podzielić go przez szerokość kafla.Postać ma 50 px wysokości i 20 px szerokości Skoro środek jest na x=100 i y=100 to górny lewy róg znajduje się na x=90 a y=75 bo 50/2=25 i 20/2=10 Na układzie współrzędnych lewy górny róg znajduje się wcześniej od środka postaci czyli odejmujesz x=10 a y znajduje się wyżej czyli odejmujesz 25 Otrzymany x oraz y dzielisz przez szerokość kafla-i masz obliczoną kolizje dla lewego górnego rogu teraz zrób to dla 3 pozostałych w podobny sposób.
|
|
DejaVu |
» 2013-05-30 20:05:12 Na mapie kafelkowej najpierw wykrywasz 'czy pole jest puste' na które chcesz wejść, a następnie wykonujesz ruch (wiedząc, że jest puste). Jeżeli pole jest 'zajęte', to można się ewentualnie pokusić o sprawdzanie dokładniejsze tj. pikselowe jak @DanielSC wspomniał przed chwilą, jednak najpierw skupiłbym się na celu pierwszym opisanym przeze mnie :) /edit: Swego czasu pytań związanych z tworzeniem kolizji było sporo, ale w kontekście Allegro, więc może warto poczytać: |
|
czosnek17 Temat założony przez niniejszego użytkownika |
» 2013-05-31 17:06:48 @DanielSC dzięki, tak to wygląda:
int lgx =( - psprw + pozycja.x ) / skaf; int lgy =( - psprw + pozycja.y ) / skaf;
int pgx =( pozycja.x + psprw ) / skaf; int pgy =( pozycja.y - psprw ) / skaf;
int pdx =( pozycja.x + psprw ) / skaf; int pdy =( pozycja.y + psprw ) / skaf;
int ldx =( pozycja.x - psprw ) / skaf; int ldy =( pozycja.y + psprw ) / skaf;
if( mapa[ lgx ][ lgy ].ckol == 1 ) return 1;
if( mapa[ pgx ][ pgy ].ckol == 1 ) return 1;
if( mapa[ pdx ][ pdy ].ckol == 1 ) return 1;
if( mapa[ ldx ][ ldy ].ckol == 1 ) return 1;
@DejaVu Na mapie kafelkowej najpierw wykrywasz 'czy pole jest puste' na które chcesz wejść, a następnie wykonujesz ruch (wiedząc, że jest puste).
|
Nie wiem czy dobrze rozumiem. Gdyby postać przemieszczała się tak, że zawsze jest na 1 kafelku, a ruch to postawienie jej na sąsiednim, czyli nie porusza się płynnie tylko "skacze", to dałoby się to zrobić. Ale jeżeli porusza się płynnie, to co masz na myśli? |
|
pekfos |
» 2013-05-31 17:15:22 a ruch to postawienie jej na sąsiednim, czyli nie porusza się płynnie tylko "skacze" |
Jak się nie zrobi płynnego przejścia, to będzie skakać. |
|
czosnek17 Temat założony przez niniejszego użytkownika |
» 2013-05-31 17:17:05 A, o to chodzi. To dzięki wszystkim i zamykam. |
|
« 1 » |