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

Kolizja - trudny orzech do zgryzienia

Ostatnio zmodyfikowano 2013-02-23 18:08
Autor Wiadomość
unimator
» 2013-02-22 17:27:40

Czaisz że to nic nie pomoże? Poprostu nie wykryje kolizji...

Edit:
Chyba że sprawdzałbym też czy kolizja nastąpiła w ten sposób ((int)ob.X + (int)ob.vX) itd
Jak rzutujesz od tak sobie floaty do intów to się nie dziw, że Ci nie działa.

BTW
To co Ci napisałem musi zadziałać. Sprawdzasz czy po przesunięciu nastąpi zetknięcie się obiektów. Jeśli nastąpi to obiektu nie przesuwasz (lub przesuwasz tak by obiekty się stykały). Jeśli natomiast po przesunięciu nie będzie zetknięcia z drugim obiektem to przesuwasz. Tak zapewne jest to realizowane w większości gier.

No i jeszcze nie ma tu znaczenia czy użyjesz do tego floatów czy intów (tak długo jak ich ze sobą nie mieszasz).


 Mamy powiedzmy spadający obiekt który jest dokładnie dokładnie o 0.8(~1)px oddalony (w osi Y) od górnej krawędzi tamtego innego obiektu. Mnożnik przesunięcia tego obiektu jest teraz 1.8. Nie jest teraz wykrywana kolizja, więc obiekt przesuwa się w dół znowu o 1.8 I co teraz? Kolizja nadal jest nie wykrywana ale obiekt jest teraz już nie na równo z górną krawędzią innego obiektu.

To sprawdź czy nastąpiła kolizja dla punktów po przesunięciu i dopiero wtedy przesuwaj. Czyli sprawdź czy nastąpi kolizja dla x+dx i jeśli nie nastąpiła to przesuń o dx.
To co Ci napisałem jak najbardziej wykryje taką kolizję, bo:
y1 - pozycja obiektu spadającego na osi y
y2 = y1 - 0.8 - pozycja tego drugiego obiektu (na osi y)
dy = -1.8 - wektor przesunięcia obiektu (czyli inaczej droga jaką pokonuje w jednostce czasu)
Sprawdzamy czy: y1 + dy > y2
y1 - 1.8 > y1 - 0.8
y1 - 1 > y1 => nierówność sprzeczna - nastąpiła kolizja czyli nie przesuwamy (lub przesuwamy tak, żeby obiekt nam nie lewitował ten pixel nad drugim obiektem)

Przykładowe inne wartości:
y1 - to samo
y2 = y1 - 1.75
dy = -1.04
Sprawdzamy czy: y1 + dy > y2
y1 - 1.04 > y1 - 1.75
y1 > y1 - 0.71 => nierówność prawdziwa - nie nastąpiła kolizja czyli możemy spokojnie przesunąć obiekt o dy.

Aha, oczywiście zakładamy, że obiekty poruszają się w kartezjańskim układzie współrzędnych.
Jeśli nadal twierdzisz, że matematyka jest błędna to ja sobie odpuszczam drążenie tematu.
P-76717
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-02-22 20:47:45
Aaaa to takie buty, Wasilek czaje, unimator też dzięki, ale Wasilek wytłumaczył krótko i dokładnie.
Jak rzutujesz od tak sobie floaty do intów to się nie dziw, że Ci nie działa.
Nie, nie, nie... Mówiłem że nie pisze teraz żadnej tego typu gry, więc wiesz...
P-76740
Wasilek
» 2013-02-23 18:08:03
Szkoda tylko, że nie wpadam na taki pomysł gdy sam pisałem kolizję :P
P-76811
1 « 2 »
Poprzednia strona Strona 2 z 2