Bewegung auf einer Geraden

Cymatoxa

Mitglied
Hi,
ich möchte ein kleines Spiel schreiben.
Ich hab Objekte mit verschiedenen Geschwindigkeiten, die sich von Punkt zu Punkt bewegen sollen.
Jedes Objekt beinhaltet 3 Punkte: Startpunkt, Endpunkt und die aktuelle Position.
Mein Problem ist: Wie bewegen ich ein Objekt langsam von beispielsweise (4,3) nach (19, 24)?

Mein Code ist aktuell dieser:
Code:
public void tick() { // wird alle [x] ms aufgerufen
    // damit auch Kommazahlen berücksichtigt werden...
    int s = (int) speed;
    speedC += speed-s;
    if (speedC >= 1) {
        speedC --;
        s ++;
    }
    move(s);
}

public void move(int s) {
    Point p0 = start.getLocation();
    Point p1 = getLocation();
    Point p2 = target.getLocation();
    // jetzt p1 auf der Linie unm Strecke s zwischen p0 und p2 bewegen... aber wie?
}

Ich hoffe, ihr könnt mir helfen.
Gruß, Cymatoxa
 
Hallo!

Mit deinem Code kann ich wenig anfangen... So ganz verstehe ich nicht, worauf das hinauslaufen soll!

Im Prinzip solltest du eine Art "Endlosschleife" haben, welche die Position deiner Objekte immer wieder neu berechnet und sie dann - z.B. - neu zeichnet.

Du weißt die Geschwindigkeit, mir der sich das Objekt bewegt, und du weißt die Zeit, die seit der letzten Berechnung vergangen ist (eine einfache, aber nicht ganz saubere Variante ist eine while Schleife, die nach jedem Durchlauf N ms "schläft" ).
Mit diesen Daten kannst du die Entfernung berechnen, die dein Objekt in Richtung des Ziels zurückgelegt hat:

v = s / t
=> s = v*t

Und um diese Strecke verschiebst du jetzt dein Objekt.

Fang vielleicht erst mal mit Bewegungen in der horizontalen oder vertikalen an, die (etwas kniffelige) Berechnung der Richtung kannst du dir dann nämlich erst einmal sparen und die gesamte Strecke in x / y Richtung laufen...

Gruß,

RoCMe
 
Hi,

ich hab einen Thread, der alle - sagen wir mal 50ms - die Methode tick() aufruft.
Die Bewegung in x-y-Richtung ist ja kein Problem. Ich brauche eine Idee, eine Vertikale Bewegung durchzuführen.

Und was die Methode tick() angeht:
Ich will eine einigermaßen einstellbare Geschwindigkeit. Da reicht nicht alle 50 ms 2 pixel nach rechts und 5 nach unten. Mit der Methode kann ich auch Geschwindigkeiten von beispielsweise 3,4 benutzen. Die Methode rundet immer auf 3 und addiert 0,4 in eine andere Variable. Wenn diese 1 erreicht, ist die Geschwindigkeit im nächsten Schritt 4. (Hoffe, das war verständlich)

Gruß,
Cymatoxa
 
Zuletzt bearbeitet:
Hi,
Die Bewegung in x-y-Richtung ist ja kein Problem. Ich brauche eine Idee, eine Vertikale Bewegung durchzuführen.
Cymatoxa

Für mich ist die y-Richtung irgendwie ziemlich vertikal, aber egal :p

Warum soll sich die Geschwindigkeit denn ändern? Beschleunigst das Objekt denn?

Ich hab nicht viel Zeit, aber für eine absolute Kurzfassung reicht es:

1. Richtungsvektor berechnen: Richtung = Ziel - Start
2. Richtungsvektor auf Länge 1 normieren, also momentante Länge l berechnen und den Vektor mit 1 / l multiplizieren.
3. Mit der seit dem letzten Schritt vergangenen Zeit dt und der gegebenen (momentanen?) Geschwindigkeit v die Strecke berechnen, die zurückgelegt worden ist:
s = v * dt;
4. Den normierten Richtungsvektor mit s multiplizieren und zur letzten Position addieren.

1. und 2. sind Schritte, die du nur einmal durchführen musst, d.h. du könntest sie vor der eigentlichen Schleife berechnen.

Mit diesem Verfahren kannst du die Geschwindigkeit / Position natürlich mit Nachkommastellen angeben. Warum rechnest du denn mit ints? Der Darstellung wegen?
 
Autsch

ich meinte natürlich diagonal.

Warum rechnest du denn mit ints? Der Darstellung wegen?
speed und speedC sind doubles. Sorry, vergessen zu erwähnen.

Vielen Dank jedenfalls für deine Hilfe.
Ich hab jetzt eine eigene Klasse, die sich darum kümmert. Wen es interessiert: Die nächste Position ist
Xneu = Xalt + "Entfernung Y" * "Geschwindigkeit" / ( Wurzel ("Entfernung X"^2 + "Entfernung Y"^2) )
Yneu = Yalt + "Entfernung X" * "Geschwindigkeit" / ( Wurzel ("Entfernung X"^2 + "Entfernung Y"^2) )

Sieht seltsam aus, läuft aber :)

Edit: hab ein kleines Testprog für die Rechnungen gemacht. Wenn ihr es mal ansehen wollt... ;)
 

Anhänge

  • Moving Test.jar
    6,8 KB · Aufrufe: 57
Zuletzt bearbeitet:
Zurück