anieszka Temat założony przez niniejszego użytkownika |
[SFML 2.0] Kolizja obiektu nieruchomego z ruchomym » 2013-05-27 10:20:36 Są znane współrzędne dwóch obiektów - jeden jest statyczny, nie porusza się, drugi przemieszcza się pionowo w górę ekranu. Chciałabym wystrzelić pocisk lecący od pierwszego obiektu tak, aby trafił w drugi obiekt. Problem polega na tym, że ten drugi obiekt się przemieszcza i nie wiem, jak wyznaczyć miejsce przed celem w które ma lecieć pocisk - żeby przeciął się z przemieszczającym się na bieżąco celem. Jak powinien wyglądać taki algorytm? |
|
polkom21 |
» 2013-05-27 10:58:14 A moze bys tak pomyslal i zrobil celownik ktory bedzie bral pozycje kursora myszki i strzelac mozna wtedy sobie pieknie jak sie tylko podoba |
|
anieszka Temat założony przez niniejszego użytkownika |
» 2013-05-27 11:40:30 A może byś tak był milszy i przy okazji czytał uważniej, jestem kobietą. Nic nie wspominałam o żadnej myszce. Dokładniej mówiąc- za pomocą klawiszy strzałek wybieram miejsce, w którym chcę postawić strzelającą wieżę. W międzyczasie idzie fala celów w kierunku pionowym do góry. W momencie postawienia wieży chcę, żeby pociski zaczęły lecieć po takiej prostej, że pocisk trafi w pierwszy, najwyższy cel. Gra tower defense. |
|
wojownik266 |
» 2013-05-27 12:59:54 Wydaje mi się że przemieszczanie czy też nie przemieszczanie obiektów w grach 2D nie ma większego znaczenia...(choć mogę się mylić). Ten kod kolizji który widać poniżej został prze zemnie użyty w grze w której wszystkie obiekty się poruszają i choć jest to bardzo prosty algorytm, spełnia swoje zadanie. Tej kolizji używam w SFML 1.6 ale wydaje mi się że w 2.0 też będzie działał:) bool kolizja( float & x, float & y, float & x1, float & y1 ) { if( abs( x - x1 ) > 20 || abs( y - y1 ) > 20 ) return false; else return true; }
|
|
anieszka Temat założony przez niniejszego użytkownika |
» 2013-05-27 13:13:30 Dzięki, ale nie chodzi mi o funkcję wykrywającą samą kolizję, ale o funkcję wyznaczającą tor, z jakim powinien poruszać się pocisk, żeby trafić w poruszający się cel. Wyobraź sobie, że strzelasz z łuku w coś, co się przemieszcza - żeby trafić, musisz strzelić przed to coś, trzeba uwzględnić, że w czasie lotu to coś zmieni położenie. I to jest właśnie moje pytanie - jak wyznaczyć to miejsce, w które strzelać, a gdzie będzie cel w momencie gdy pocisk tam dotrze. |
|
wojownik266 |
» 2013-05-27 13:17:41 No skoro tak to przyznam się że pomimo szczerych chęci nie będę mógł Ci pomóc. Ale wydaje mi się że będziesz musiała pobawić się w trygonometrię a bardziej dokładnie to w funkcje sin i cos... Powodzenia! |
|
Monika90 |
» 2013-05-27 14:49:36 Jeżeli prędkość celu i prędkość pocisku jest stała oraz znana jest odległość od celu w momencie oddania strzału, to być może zadziała coś takiego: Niech d = [dx, dy] to wektor odległości między dwoma obiektami w momencie oddania strzału, v = [vx, vy] to wektor prędkości celu, u = [ux, uy] wektor prędkości pocisku, znamy szybkośc pocisku czyli |u| (długość wektora u, czyli sqrt(ux*ux + uy*uy)), a musimy znaleźć jego składowe ux i uy.
Niech t będzie czasem po którym dochodzi do kolizji, wtedy: t * |u| = |d| + t * |v| oraz t * ux = dx + t * vx t * uy = dy + t * vy
z pierwszego równania wyznaczamy czas, wstawiamy do drugiego i trzeciego i gotowe. Jeżeli zamiast ux i uy chcesz mieć kąt, to std::atan2 ci pomoże.
/edit: Sorry, nie przmyślałam tego, to równanie jest złe: t * |u| = |d| + t * |v|, trzeba wyznaczyć czas w jakiś inny sposób |
|
kubawal |
» 2013-05-27 16:03:36 Jakiś silnik fizyczny(najlepiej Box2d) i chyba CCD, żeby nie było efektu tunelowania |
|
« 1 » 2 |