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

[SFML 2.0] Kolizja obiektu nieruchomego z ruchomym

Ostatnio zmodyfikowano 2013-05-28 19:03
Autor Wiadomość
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?
P-84054
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
P-84057
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.
P-84059
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ł:)

C/C++
bool kolizja( float & x, float & y, float & x1, float & y1 )
{
    if( abs( x - x1 ) > 20 || abs( y - y1 ) > 20 )
         return false;
    else
         return true;
   
}
P-84061
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.
P-84062
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!
P-84063
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
P-84065
kubawal
» 2013-05-27 16:03:36
Jakiś silnik fizyczny(najlepiej Box2d) i chyba CCD, żeby nie było efektu tunelowania
P-84070
« 1 » 2
  Strona 1 z 2 Następna strona