# Rotieren eines Objekts (2D)



## GeRrItK. (7. Mai 2011)

Hallo Leute,

ich programmiere seit kurzem mit Java und habe das Tutorial von Quaxli mal durchgearbeitet. Ich habe das nun soweit fertig und mir schon aus dem Hubschrauber nen Auto gebastelt und aus den Raketen andere Autos und nen paar Besonderheiten eingefügt.

Nun möchte ich mein Auto "richtig" steuern. Also wenn ich Rechts drücke das sich das Auto nach rechts dreht. Wie kann ich das bewerkstelligen? Zudem muss die Berechnung der Bewegung dann ja auch anders aussehen. Wie berechnet man das ganze dann?

Man muss dann ja anhand der Rotation die Verschiebung auf X und Y Achse berechnen? Leider bin ich bisher nur auf die Idee gekommen die beiden Katheten des dadurch entstehenden Dreiecks zu berechnen und das Auto anhand dieser Werte zu bewegen. Dies schien mir aber auch nicht wirklich sinnvoll, da das Auto dann ja nicht die Hypothenuse abfährt sondern einen Bogen.

Ich hoffe auf Hilfe 

Gruß,
Gerrit


----------



## slawaweis (7. Mai 2011)

das Stichwort heißt Interpolation, ist ein größeres Gebiet. Für den Anfang empfehle ich das Timing Framework, sowie folgende Artikel:

Timing Framework &mdash; Java.net

Timing Framework: Wiki: Home &mdash; Java.net
Timing is Everything | Java.net
Time Again | Java.net

Slawa


----------



## GeRrItK. (7. Mai 2011)

Hmm ich hab mir das jetzt ein wenig durchgelesen und so aber iwie steig ich nicht durch wie man damit nen Objekt drehen kann?  Sieht für mich alles iwie eher aus wie Animation und Kurvengleichungen


----------



## Cola_Colin (8. Mai 2011)

Ich hab das in einem früheren Projekt einmal mit folgenden Formeln gemacht:


```
int xSpeed = Math.cos(angleOfMovementInRadians) * straightForwardSpeed;
int ySpeed = Math.sin(angleOfMovementInRadians) * straightForwardSpeed;
```

Dann bei der Bewegung der Spielfigur x und y getrennt mit der jeweiligen Geschwindigkeit bewegen.

Dazu musst du dann das Auto eben irgendwie drehen, dass hängt von deiner Zeichentechnik, ab wie du dass am besten realisierst, die Klasse Graphics2D bietet da durchaus einige Methoden zur Rotation.


----------



## GeRrItK. (8. Mai 2011)

Wenn ich jetzt noch wüsste wie ich mein Auto drehen kann dann könnte man es ja glatt mal austesten 

EDIT:

Bei Tastendruck habe ich jetzt folgenden Code:

```
xSpeed = (int) Math.cos(Math.toRadians(45)) * speed;
ySpeed = (int) Math.sin(Math.toRadians(45)) * speed;
rtw01.setHorizontalSpeed(xSpeed);
rtw01.setVerticalSpeed(ySpeed);
```

Allerdings bewegt sich mein Auto keinen Zentimeter?!

EDIT²:

Habs nun. Den Datentyp auf Double geändert. ^^ jetzt fehlt nurnoch meine Drehmethode


----------



## Cola_Colin (8. Mai 2011)

Was genau fehlt dir noch ?
Das Auto muss seine aktuelle Drehung im Bogenmaß plus seine Geschwindigkeit kennen, und wird dann nach den Formeln bewegt.
Die Drehung wird von Pfeil links und rechts beeinflusst.

Beim Zeichnen wird die Grafik jeweils gedreht gezeichnet, dass geht bei Verwendung von der Graphics-Klasse (die verwendet Quaxlis Tutorial doch ?!) z.B. so:

```
AffineTransform af = g2d.getTransform();
        g2d.rotate(angleInRadians, centerOfCarX, centerOfCarY);

        g2d.drawImage(...);

        g2d.setTransform(af);
```

EDIT:

Die konstante 45 ist da ein wenig Witzlos, wenn du das Auto dynamisch drehen willst, das ist dir klar, oder ?

Es müsste eher so aus sehen:

//Reaktion auf Pfeil rechts:
carAngle += 0.1; // Wert ist geraten, frag mich nicht wie schnell das sich bei 0.1 jetzt drehen wird.

bei Pfeil Links eben -= statt +=. Wobei auch das könnte andersrum sein.

Dann anhand des neuen Winkels die Geschwindigkeit für x und y berechnen und diese verwenden.


----------



## GeRrItK. (8. Mai 2011)

Ja die konstante war nur zum testen  Mein Auto kann jetzt schonmal seine Runden drehen nur halt mit der Nase in die falsche Richtung 

Die Graphics Methode sieht so aus:

```
public void drawObjects(Graphics g) {
g.drawImage(pics[currentpic], (int) x, (int) y, null);
}
```

Was müsste ich da jetzt alles neu definieren?!


----------



## Cola_Colin (8. Mai 2011)

Schau dir meinen Code an, da ist auch ein drawImage.
Nur das Drumherum ist neu.
g2d ist dein g nur zu einem Graphics2D gecastet.


----------



## GeRrItK. (8. Mai 2011)

Woah klasse danke euch  Es funzt tadellos  :toll: :applaus:


----------

