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

[SFML 2.0] Dokładność kolizji na mapie kafelkowej

Ostatnio zmodyfikowano 2013-05-31 17:17
Autor Wiadomość
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:
C/C++
kafx = pozycja.x / 60; // dziele pozycje przez szerokosc sprita i wiem na ktorym kafelku w osi x stoi postac
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 :/
P-84366
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.


P-84388
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ć:
Frazy, które należy wpisać w wyszukiwarkę google:
P-84389
czosnek17
Temat założony przez niniejszego użytkownika
» 2013-05-31 17:06:48
@DanielSC dzięki, tak to wygląda:
C/C++
// psprw - polowa szerokosci sprita
// skaf - szerokosc kafla
int lgx =( - psprw + pozycja.x ) / skaf; // lewy gorny x
int lgy =( - psprw + pozycja.y ) / skaf; // lewy gorny y

int pgx =( pozycja.x + psprw ) / skaf; // prawy gorny x
int pgy =( pozycja.y - psprw ) / skaf; // prawy gorny y

int pdx =( pozycja.x + psprw ) / skaf; // prawy dolny x
int pdy =( pozycja.y + psprw ) / skaf; // prawy dolny y

int ldx =( pozycja.x - psprw ) / skaf; // lewy dolny x
int ldy =( pozycja.y + psprw ) / skaf; // lewy dolny y

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?
P-84495
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ć.
P-84498
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.
P-84499
« 1 »
  Strona 1 z 1