Zyper Temat założony przez niniejszego użytkownika |
[SFML] Kolizja i co potem? » 2012-10-24 17:40:46 Witam po raz kolejny! Mam dość poważny problem, bo umiem już wykrywać kolizję, tylko nie wiem jak to potem ogarnąć... Robiłem to już na dwa sposoby. Raz po wykryciu kolizji obiekt odskakiwał 5 px od strony, z której kolidował (używam sf::Rect). A drugi sposób to sprawdzanie kolizji z danej strony i gdy jest tam wolne obiekt może się tam poruszyć. Tworzę grę z widokiem topdown, można poruszać się we wszystkie strony. Używając tych moich dwóch sposobów problem jest gdy chcękolidować ze ścianą kilku bloków. Z jednym blokiem osobno daje radę. Ale gdy idę ocierając się o ścianę postać albo się blokuję, albo przechodząc z kolizji z jednym blokiem na kolizję z drugim skacze (zależne jest to od w/w sposobów). Być może ciężko mnie zrozumieć, więc macie tutaj mały obrazek: http://i.snag.gy/DWbUm.jpgMam nadzieje, że macie jakieś pomysły lub sposoby jak to rozwiązać. Bardzo proszę o pomoc i wiem, że było już milion takich pytań.. ale w żadnym nie było rozwiązania mojego problemu. Pozdrawiam, Zyper |
|
DejaVu |
» 2012-10-24 19:36:45 |
|
Zyper Temat założony przez niniejszego użytkownika |
» 2012-11-02 10:30:06 Witam ponownie :P
Nigdzie nie ma o takim problemie jaki ja mam. Są tam problemy z tunnelingiem albo nawet samym wykrywaniem kolizji.. Ja jak mówiłem, umiem wykryć kolizję, tylko jak najlepiej ma się zachować obiekt po kolizji? Jak ta kolizja musi być też dokładna? Muszę wykrywać ze wszystkich stron, czy może tylko tam gdzie jest postać?
Proszę o napisanie teoretycznie jak to ma się odbywać. Kod raczej dam radę sam.. Mam skrypt poruszania w 4 kierunkach (jednocześnie), pozycje maski gracza i pozycje grafiki gracza (może będzie potrzebne osobno, nie wiem) no i co z tym teraz dokładnie zrobić? Zależy mi na tym, że jak poruszam się w górę i w lewo, a koliduję u góry to postać nadal idzie w lewo. Bo taką kolizję gdzie postać całkiem się zatrzymuje zrobić umiem, ale nie o to tu chodzi :P
Proszę o pomoc, już sam nie mam żadnych pomysłów. |
|
Mrovqa |
» 2012-11-02 10:33:57 Idąc w górę (trzymając naciśniętą strzałkę) możesz sprawdzać, czy bohater nie koliduje z czymś od góry. Podobnie możesz zrobić z innymi kierunkami. Ewentualnie sprawdzasz czy po przeniesieniu postaci w górę nie nastąpi kolizja - wiesz, czy ten przykładowy ruch w górę jest dozwolony. Sposobów jest wiele, trzeba tylko trochę pomyśleć :) |
|
Zyper Temat założony przez niniejszego użytkownika |
» 2012-11-02 11:17:31 No tak, myślałem, już nad tym. Ale kolizja w SFML wykrywana za pomocą IntRect zaczyna wykrywać od lewego górnego rogu, więc gdy będzie taka ściana bloków to już nie będzie tak fajnie. Wykrywany będzie tylko jeden blok, a po wejściu w strefę kolizji drugiego postać dziwnie odskoczy/zablokuje się.
Bawił się już ktoś w ogóle z kolizjami w SFML? Mnie też na pierwszy rzut oka wydawało się proste, ale wychodzą jakieś dziwne problemy i komplikacje :/ |
|
DejaVu |
» 2012-11-02 11:35:30 Wykrycie kolizji między dwoma obiektami jest proste. Wykrywanie kolizji między wieloma obiektami już niekoniecznie. Dostałeś jednak linki gdzie szukać informacji, więc skorzystaj z nich. |
|
Zyper Temat założony przez niniejszego użytkownika |
» 2012-11-02 11:55:10 Jesteś pewien, że tam jest rozwiązanie mojego problemu?
Znalazłem o: tunnelingu, Box2D, wykrywaniu kolizji, sprawdzaniu z której strony wystąpiła kolizja, kolizji per pixel, mapie kafelkowej itp.
Mógłbym oczywiście przeszukać jeszcze te milion stron w Google, ale jest tam ta odpowiedź, czy podałeś mi te linki dla świętego spokoju? |
|
DejaVu |
» 2012-11-02 12:02:18 Rozwiązaniem samym w sobie jest nauczenie się Box2D i zastosowanie tej biblioteki. Alternatywną możliwością jest sprawdzanie kolizji 'każdy z każdym' i 'cofanie czasu' w celu usunięcia problemu kolizji. Można też zamiast cofania czasu zastosować algorytm 'odpychania od siebie obiektów' tych, które są w stanie kolizji. Kolizje nie są proste, więc mimo wszystko polecam naukę Box2D.
PS. Nie jesteś pierwszą osobą, która zadaje takie pytania, więc czemu zakładasz, że nie ma odpowiedzi na forum na to pytanie? :) |
|
« 1 » 2 |