Objekt in Winkel/Richtung bewegen & drehen

Morpheyz

Grünschnabel
Hi,

wir müssen nun in der Schule ein kleines Java-"Spiel" entwickeln und natürlich auch alles dazu erklären können. Unsere Gruppe entschied sich für eine Art Tower-Defesne mit nur einem Turm. =D
Der Turm befindet sich in der Mitte des Fensters, dreht sich immer in Richtung des Mauszeigers und schießt auch in diese. Die Formel zum drehen haben wir schon und zum Bewegen der Schüsse auch soweit. Unser Problem ist nun, das ganze in Java umzusetzen. Die Formel ist dabei ja noch einfach. Allerdings wirds beim drehen des Objekts schon schwierig.
Soweit ich festgestellt habe, ist die Formel zum bewegen sowieso noch nicht ganz ausgereift. Wobei ich allerdings nicht weiß, ob es an Java oder der Formel liegt.

Zum Drehen benutzen wir in etwa diese:
Code:
int a = jLabel1.getX() - mousePos.x;
int b = jLabel1.getY() - mousePos.y;

double ang = Math.atan2(a,b);
double dir = ang/(Math.PI/180);      //Ich weiß nicht, ob das noch nötig ist. =O

Debug messages helfen mir leider auch nicht wieter, da diese mir zum Teil völlig (für mich) unlogische Ergebnisse angeben.

Zum Bewegen diese Formel:
Code:
int speed = 10;

int x_speed = Math.cos(ang) * speed;
int y_speed = Math.sin(ang) * speed;

int x_pos = jLabel1.getX();
int y_pos = jLabel1.getY();

jLabel1.setLocation(x_pos + x_speed , y_pos + y_speed);

Ich denke das ist so richtig. Die original-formel hab ich nur in der Schule. >.<

Wenn ich das Objekt nun bewege, kommen komische Winkel raus und das Objekt bewegt sich jedenfalls nicht dahin, wo es hin soll.

Und noch eine Frage:
Wie kann man eine Canvas in Java drehen?



Danke schonmal im Vorraus
Morpheyz
 
Du musst nicht die Canvas an sich drehen, du musst nur das Bild in der Canvas drehen.
Die Klasse Graphics2D hat auch ein paar methoden die euch sicher weiterbringen werden.(Drehen mit einem fixpunkt)

Bei dem obrigen Code fällt mir auf dass:
int x_speed = Math.cos(ang) * speed;
int y_speed = Math.sin(ang) * speed;

du vergessen hast den Winkel der warscheinlich in GRAD ist, in RAD umzurechnen. Dazu gibt es auch wiederrum eine statische Methode in der Klasse Math ( .todegree() | .toradian() )

mfg
germanterminator
 
Hmm..
So ganz verstanden hab ich das jetzt nicht. ^^ Ich kenn zwar den Unterschied zwischen rad und grad, aber ich wieß nich, was ich jetzt rechnen soll? o_O

Hier ist mal der ganze Code der Bewegungsfunktion. Auskommentiertes, unwichtiges Zeug rausgenommen:
Code:
public void move() {
            Point mousePos = MouseInfo.getPointerInfo().getLocation();
           
            int a = jLabel1.getX() - mousePos.x;
            int b = jLabel1.getY() - mousePos.y;

            double ang = Math.atan2(a,b);

            double x_Move = Math.cos(ang) * speed;
            double y_Move = Math.sin(ang) * speed;

            int i_x_Move = double2int(x_Move);
            int i_y_Move = double2int(y_Move);

            jLabel1.setLocation(jLabel1.getX()+i_x_Move,jLabel1.getY()+i_y_Move);
}

"final double speed" wird global mit dem Wert 10 deklariert.

Tja das Problem besteht nun darin, dass sich das jLabel nicht in Richtung des Mauszeigers bewegt. o_O
 
Das mit der Richtung zwischen Maus und Turm (bei mir war es nur kein Turm) habe ich mit einem Vektor gelöst:

Code:
// Der Vektor ist (Maus X - Turm X, Maus Y - Turm Y)

// Formel: 
// 1/wurzel(x²+y²)*x 
// und 
// 1/wurzel(x²+y²)*y

speedX = 1/Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))*(x1-x2);
speedY = 1/Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))*(y1-y2);

MfG Marvin
 
Zurück