Próbuję znaleźć dobre rozwiązanie, by kula trafiła wroga. Gra polega na obronie wieży 2D, wieża ma wystrzelić kulę i trafić wroga gwarantowana.
Wypróbowałem to rozwiązanie - http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
Wspomniany link odejmuje pochodzenie pocisku, a także wroga (odejmowanie wektorowe). Próbowałem tego, ale kula podąża za wrogiem.
float diffX = enemy.position.x - position.x;
float diffY = enemy.position.y - position.y;
velocity.x = diffX;
velocity.y = diffY;
position.add(velocity.x * deltaTime, velocity.y * deltaTime);
Znam wektory, ale nie jestem pewien, jakie kroki (operacje matematyczne wektorów) należy wykonać, aby uruchomić to rozwiązanie.
Odpowiedzi:
Twoje rozumowanie było doskonałe: użyj wektora, aby przejść z mojej pozycji do celu. To jest cel wektora ; po prostu zapomniałeś prędkości !
Prędkość to wektor: prędkość i kierunek. Jeśli jednak zapomnisz znormalizować wektor różnicy i pomnożyć go przez prędkość pocisku (skalar), zasadniczo mówisz, że jeśli jesteś blisko celu (wektor różnicy jest mały), kula zwalnia ; podczas gdy jesteś daleko, prędkość pocisku jest większa.
To jest podstawowy problem: musisz obliczyć zarówno kierunek, jak i wielkość wektora.
źródło
Jeśli cel porusza się w stałym kierunku w stałym tempie, a ścieżka pocisku znajduje się w linii prostej w stałym tempie, możesz użyć równania kwadratowego, aby przewidzieć dokładne miejsce, w którym się przecinają, i wycelować działo wieży w tym miejscu .
Ponieważ jest pewne, że kula trafi w cel, a ty możesz obliczyć dokładny czas, jaki zajmie od wystrzału do uderzenia, nie będzie wymagane wykrywanie kolizji, po prostu odpal broń, poczekaj obliczony okres czasu, zarejestruj trafienie.
Oto pseudo kod dla równania kwadratowego:
źródło
Musisz „przewidzieć” położenie obiektów, zanim pocisk do nich dotrze. Możesz to zrobić, używając obiektów prędkość / prędkość (mam nadzieję, że jest stała;)) i jej wektora kierunkowego.
Nie jestem pewien, jaka jest dokładna formuła z głowy, ale myślę, że to coś takiego:
NewPosition = OldPosition + (Speed * DirectionVector);
Jeśli masz ustawioną ścieżkę, konieczne będzie ponowne obliczenie, gdy obiekt zmieni kierunek. Użyj tej NewPosition jako wektora wroga. Kula powinna trafić w obiekt bez efektu naprowadzania. Naprowadzanie następuje z uwagi na fakt, że obiekt wroga poruszył się od czasu obliczenia oryginalnego wektora, może to nadrobić tylko wtedy, gdy obiekt porusza się w jednym kierunku wystarczająco długo.
Mam nadzieję że to pomoże :)
źródło
Możesz uniknąć używania pierwiastka kwadratowego i potęgi 2.
Wszystko jest zapisane z pamięci. Nawiasem mówiąc, użyj elementów, które działają - przetestuj to linia po linii, jeśli jesteś w tym nowy. Liczba zmiennoprzecinkowa to liczba w AS3.
źródło