Obecnie mam coś takiego:
float deltaX = point0.getX() - point1.getX();
float deltaY = point0.getY() - point1.getY();
I co 0,01 sekundy odświeżam moje obiekty w następujący sposób:
object.setPosition(object.getX()-deltaX/100,object.getY()-deltaY/100);
To przenosi mój obiekt z punktu 0 do punktu 1 w ciągu 1 sekundy. Potrzebuję 2 punktów, aby móc przesuwać obiekt z punktu 0, skierowany w stronę punktu 1 ze stałą prędkością. Tak więc, kiedy mam punkt bliższy mojego punktu początkowego, obiekt przesunie się w jego kierunku z taką samą prędkością, jak wtedy, gdybym miał dalszy punkt. Wszelkie sugestie są mile widziane. Dzięki.
game-mechanics
movement
Fofole
źródło
źródło
Odpowiedzi:
Użyję struktur algebry liniowej, ponieważ łatwiej jest opisać operacje w ten sposób. Jeśli nie wiesz, jak zaimplementować te operacje wektorowe, na końcu udzielę krótkiego wyjaśnienia.
Powiedzmy, że zaczynasz od tych wartości:
start
iend
zaznacz punkty końcowe ruchu,speed
liczbę pikseli, o jaką powinien się poruszać na sekundę, ielapsed
szybkość, z jaką zaktualizujesz pozycję obiektu (niektóre silniki już zapewniają tę wartość dla Ciebie ):Pierwszą rzeczą, którą chcesz obliczyć, jest odległość między dwoma punktami i znormalizowany wektor zawierający kierunek od początku do końca. Ponadto należy „przyciągnąć” pozycję obiektu do
start
punktu. Ten krok jest wykonywany tylko raz, na początku:Następnie na metodę aktualizacji, możesz przesunąć obiekt dodając mnożenia
direction
,speed
aelapsed
na jego miejscu. Następnie, aby sprawdzić, czy ruch się skończył, zobaczysz, czy odległość między punktem początkowym a bieżącą pozycją obiektu jest większa niż obliczona początkowa odległość. Jeśli to prawda, przyciągamy pozycję obiektu do punktu końcowego i przestajemy przenosić obiekt:Skrócone informacje o operacjach wektorowych
Reprezentacja
Suma / Odejmij
Pomnóż przez skalar (liczba zmiennoprzecinkowa)
Długość / odległość
Normalizować
To powinno wystarczyć do konwersji powyższego kodu w zwykłe operacje, jeśli nie masz
Vector
dostępnej klasy.Przykład konwersji
źródło
Vector2 start;
staje sięfloat startX, startY;
. Możesz łatwo obliczyć odległość ręcznie, jak wyjaśnię na końcu. Tjfloat dX = bX - aX; float dY = bY - aY; float distance = Math.sqrt(dx*dx+dy*dy);
.Utwórz wektor i znormalizuj go. Ostrzeżenie, przed nami jakiś pseudo-kod z niewłaściwymi numerami:
Otrzymasz wektor typu:
Teraz znormalizuj wektor, a otrzymasz :
Odtąd jest to ten sam ruch, co w twojej delcie.
źródło
Skopiowałem i wkleiłem z mojej odpowiedzi na: Zdobądź punkty na linii między dwoma punktami
W pseudokodzie:
źródło