Java Moving Sprites with Mouse

Federhalter

Mitglied
Hallo Leute,

seit geraumer Zeit versuche ich ein Sprite (hier: ein Panzer) im Stil von "Command and Conquer" zu bewegen.
Dabei ist mir bisher folgendes gelungen:

Zuerst erzeuge ich einen Panzer (nur zu Demonstration-zwecken) per Klick auf einen JButton. Anschließend klickt man den erzeugten Panzer an, dieser wird rot umrandet und schließlich klickt man zum Beispiel in den vierten Quadranten vom Panzer aus gesehen und dieser dreht sich bis die beiden Winkel (also Maus- und Rotationswinkel) gleich sind und bewegt sich schließlich dorthin. Die Richtung wird durch eine Richtungslinie dargestellt. Soweit so gut.

Das Problem ist nun, dass bei meiner Winkelberechnung der vierte und dritte Quadrant von 0 bis 180 reichen und der zweite sowie erste Quadrant das gleiche darstellen nur negativ. Außerdem schlenkert der Panzer im dritten Quadrant und im ersten und zweiten wird nur die Bewegung ausgeführt und nicht die Richtungs-Drehung. Also muss irgendetwas an meiner Winkelberechnung schlecht sein ich weiß aber nicht genau was.

Ich poste hier einen Teil meines Codes der relevant ist. Die erste Methode ist die update-Funktion in der der Panzer bewegt werden soll. Hier findet auch die Winkelberechnung zwischen Maus und Panzer statt mittels atan2. Anschließen wird mithilfe des Winkels der xspeed sowie der yspeed berechnet und in den beiden if-Bedingungen der Panzerposition zuaddiert, damit dieser sich bewegt.


public void update(int xm,int ym,long delta){



tankbounding.x = (int) centerX;

tankbounding.y = (int) centerY;



winkel = Math.atan2((ym)-(centerY),(xm)-(centerX))*(180/Math.PI);



xspeed = (float) Math.cos(winkel*(Math.PI/180))*SPRITE_SPEED*delta;

yspeed = (float) Math.sin(winkel*(Math.PI/180))*SPRITE_SPEED*delta;



if((centerX-xm)*(centerX+xspeed-xm) > 0 && centerX != xm){

centerX+=xspeed;

}


if((centerY-ym)*(centerY+yspeed-ym) > 0 && centerY != ym){

centerY+=yspeed;

}

}

In der nächsten Methode lasse ich mir das rotierte BufferedImage zurückgeben mithilfe einer AffineTransform und setzte den Drehpunkt ins Zentrum des Panzersprites.


public BufferedImage rotate(double winkel){

AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(winkel),tank.getWidth()/2,tank.getHeight()/2);

BufferedImage rotateImage = new BufferedImage(tank.getWidth(),tank.getHeight(),tank.getType());

Graphics2D g2 = (Graphics2D) rotateImage.getGraphics();

g2.setTransform(at);

g2.drawImage(tank,0,0,null);

return rotateImage;

}

So und nun wird es wild, denn in der render-Methode wird nicht bloß gezeichnet sondern auch gerechnet (was eigentlich nicht üblich ist). Zunächst berechne ich nochmal den Winkel im Gradmaß zwischen Maus und Sprite und zähle rwinkel hoch um das Sprite zu rotieren, also um sein Zentrum.


public void renderTank(Graphics g){





if(tank != null){

winkel1 = Math.toDegrees(Math.atan2((MouseInput.mousy)-(centerY),(MouseInput.mousx)-(centerX)));



g.drawImage(rotate(rwinkel),(int)tankbounding.x, (int)tankbounding.y, null);

if(Display.clicked){

g.drawImage(rotate(rwinkel++),(int)tankbounding.x, (int)tankbounding.y, null);

if(rwinkel>=0&&rwinkel<90){

if(rwinkel>=(int)winkel1){

rwinkel = (int)winkel1;

canmove = true;

}

}

else if(rwinkel>=90&&rwinkel<180){

if(rwinkel>=(int)winkel1){

rwinkel = (int)winkel1;

canmove = true;

}

}

else{

canmove = false;

}

}



}



}

Es wird alles nur beim ersten Mal im vierten Quadranten so wie ich es haben will richtig angezeigt dann nicht mehr und ich würde gerne wissen warum.

Würde mich über Hilfe sehr freuen.


Grüße Federhalter