bewegt sich ein Objekt von Punkt zu Punkt in einem linearen Pfad
Ich versuche, verschieben Sie ein sprite über den Bildschirm in einer geraden Linie in Richtung auf die Stelle, wo habe ich Sie berührt den Bildschirm, was ich Tat, war auf der update() in jedem Schleifendurchlauf überprüft, um zu sehen, wenn das aktuelle sprite der Lage x y ==, um das Ziel x ,y . wenn es nicht sprite ist x++ und y++...
die Sache ist die ..it ain ' T bewegen sich in einer geraden Linie... da gibt es Fälle, in denen die x-oder die y-Koordinate erreicht das Ziel x oder y zuerst... wie ich es geändert, so dass beide x und y entspricht dem Ziel zusammen?
meine aktuellen pseudo-code für das sprite-Objekt
destX = destination X
destY = destination Y
posX = current X
posY = current Y
public void update(){
if(destX > posX && destY < posY)
{
posX++;
posY--;
}
else if (destX > posX && destY > posY){
posX++;
posY++;
}
else if(destX < posX && destY > posY)
{
posX--;
posY++;
}
else if(destX < posX && destY < posY){
posX--;
posY--;
}
else if(destX < posX)
posX--;
else if(destX > posX)
posX++;
else if(destY < posY)
posY--;
else if(destY > posY)
posY++;
auch mit bresenham oder irgendeinem anderen Algorithmus, ist es unvermeidbar, dass x oder y können Sie erreichen Ihr Ziel, bevor die anderen in einigen Fällen (angenommen, der Ziel-x ist das gleiche wie das original x?)
Bresenham ' s nicht funktioniert, für die vertikalen Linien. Das größte problem mit der OPs-Ansatz ist, dass er-Schritten x und y mit der gleichen rate.
Ich bin mir ziemlich sicher, dass es funktioniert, die Vollversion sowieso nicht die Hälfte ein, die Sie zeigte in Ihrer Antwort. Nicht gleich, obwohl, das gleiche gilt für den Gegner.y = Strom.y und jede andere Linie, wo der Letzte Schritt nicht diagonal. Mein Punkt ist, ich bin mir ziemlich sicher, dass die OP in Wirklichkeit nicht wollen, was er will.
Guter Punkt. Sie sind wahrscheinlich richtig. Seine schon eine Weile, da ich eigentlich Tat, diese Art der Sache.
hmm.. auch seine Art wie diejenigen, die rts-Spiele, wo der Benutzer klickt auf ein Ziel und eine Einheit geht es in einer geraden Linie, sondern minus die Wegfindung system..
Bresenham ' s nicht funktioniert, für die vertikalen Linien. Das größte problem mit der OPs-Ansatz ist, dass er-Schritten x und y mit der gleichen rate.
Ich bin mir ziemlich sicher, dass es funktioniert, die Vollversion sowieso nicht die Hälfte ein, die Sie zeigte in Ihrer Antwort. Nicht gleich, obwohl, das gleiche gilt für den Gegner.y = Strom.y und jede andere Linie, wo der Letzte Schritt nicht diagonal. Mein Punkt ist, ich bin mir ziemlich sicher, dass die OP in Wirklichkeit nicht wollen, was er will.
Guter Punkt. Sie sind wahrscheinlich richtig. Seine schon eine Weile, da ich eigentlich Tat, diese Art der Sache.
hmm.. auch seine Art wie diejenigen, die rts-Spiele, wo der Benutzer klickt auf ein Ziel und eine Einheit geht es in einer geraden Linie, sondern minus die Wegfindung system..
InformationsquelleAutor Shizumaru18 | 2011-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Check out: http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
Dieser einfache Algorithmus wird Ihnen sagen, jeder X -, Y-Koordinaten auf einer Linie zwischen zwei Punkten. Sie könnte verwenden Sie diesen Algorithmus zur Berechnung aller Positionen, die es braucht, um zu besuchen, speichern die Koordinaten in einem array und Durchlaufen Sie das array als Sie zum aktualisieren der position.
Aus dem Artikel:
Dies ist die einfachste version. Der Artikel enthält eine bessere generalisierten Algorithmus, sollten Sie schauen.
Also am Anfang, Sie wissen, wo Sie sind und wo Sie gehen müssen. Bauen einer Methode basierend auf den oben genannten Algorithmus, der liefert ein array von java.das awt.Punkte (zum Beispiel). Dann ist dein update-Methode wäre ein einfacher Satz, den aktuellen x-und y-Werte des I-TEN Eintrag im array, und aktualisieren Sie dann den index;
BTW: Das ist nicht Java, wie er angegeben ist.
InformationsquelleAutor Josh
Ich bin den Umgang mit einer similair problem wie Ihr. (Ich habe eine arraylist halten die Geschichte der Positionen mein Spieler ist Weg, und ich will, das Zurückspulen des Spiels.)
Anstatt einfach die Erhöhung der x-und y-position mit 1 können Sie:
position.
stellt die Geschwindigkeit dar
Machte ich eine Klasse. Ich hoffe, es ist nützlich.
InformationsquelleAutor J. Rahmati
Verwenden Sie nicht zahlen. Dies ist eine sehr schlechte Idee zu arbeiten mit int-Werten. Verwenden Sie schwebt. Das wichtigste Konzept ist: definieren Sie die Anzahl der Schritte, die Sie durchführen möchten (
s
). Berechnen Sie die Unterschiede in X und Y (diffX
unddiffY
). Nehmen Sie nicht die absoluten Werte: Berechnen Sie auf diese ArtBerechnen Sie die xMove und yMove Werte durch Division
diffX
unddiffY
durchs
(Anzahl der Schritte).Und jetzt müssen Sie für jede iteration der moveX und moveY-Werte an der aktuellen position.
Und für die Zeichnung, die Sie verwenden sollten
Graphics2D
unterstützt floating-Punkte. Wenn Sie nicht möchten, zu verwenden Graphics2D, Sie können rund die floats zu int-Werte, mitMath.round(float)
.double
gibt Ihnen mehr Präzision, als Sie brauchen, für GUI-Koordinaten. Es würde nur eine Verschwendung von 4 bytes pro variable.Willst du mich verarschen? Der Algorithmus, den Sie zeigen, ist nicht einmal richtig, eben durch die Verwendung von floats. Obwohl
s * movex
könnte gleichdiffx
die Summe ders
movex
's fast nie.Bei der Verwendung von Graphics2D (Java-AWT-graphics library) zum Rendern von Dingen, es gibt Ihnen die Möglichkeit zum angeben von Positionen in floating point. Dies bedeutet, dass der Algorithmus Martijn zur Verfügung gestellt werden, werden in den meisten Fällen ausreichend. Es bricht unten, wenn Sie sind beschränkt auf die Zusammenarbeit in ganzzahligen Koordinaten-Systeme. Bresenham ' s ist im wesentlichen die gleiche Sache mit einem Fehler-Korrektur-bit.
ausreichend vielleicht, aber dezent falsch dennoch. Für jede Fraktion, die nicht exakt darstellbar als ein double (oder float) ist es nicht eigentlich das Ziel erreichen, auch wenn der Fehler im wesentlichen unsichtbar.
InformationsquelleAutor Martijn Courteaux