Aaaalso, ich hab den ganzen Vormitag und nun auch schon die hälfte des Nachmittags damit verbracht, aber ich find nichts gescheites dazu.
Ich möchte erreichen das sich mein Bild mit der oberen Kante immer zum Cursor hindreht.
Das ganze hab ich mir gedacht, löse ich mit Vektoren, wie in der Mathematik und hab mir dazu einfach eine Klasse erstellt die eine X und eine Y koordinate speichern (und mit getX/Y wiedergeben) kann.
Wenn die Maus bewegt wird, werden ein x und ein y wert relativ zur mitte des bildes gespeichert.
(=> Maus in der Mitte -> Wert X==0 Y==0)
Anhand dieser Koordinaten und des Mittelpunktes (hab ich nur in pixeln) läst sich der Vektor berechnen.
Der Standartvektor ist praktisch die Y-achse eines koordinatensystems -> (0,1)
Die Rechnung sollte(?) stimmen, um einen Winkel rauszubekommen.
Das bei mehrmaliger Ausführung das ganze nicht hinhaut(und ist auch ein Spiel - dazu wird es kommen) weiß ich , aber ist nicht mein hauptproblem, das krieg ich dann schon hin, was mich wundert ist das ich keine Winkel <80 bekomme z.b. und teilweise ein NaN (Not a Number) beim double-wert des winkels.
Hier der (hoffentlich ausreichende) quellausschnitt:
DER GESAMTE CODE (der relevanten Klasse - für alle Fälle):
PS: Sorry für 2 quelltexte, aber offensichtlich ging der spoilerbutton nicht in diesem forum/hab ihn nicht gefunden :x
MfG
Ribbley!
Ich möchte erreichen das sich mein Bild mit der oberen Kante immer zum Cursor hindreht.
Das ganze hab ich mir gedacht, löse ich mit Vektoren, wie in der Mathematik und hab mir dazu einfach eine Klasse erstellt die eine X und eine Y koordinate speichern (und mit getX/Y wiedergeben) kann.
Wenn die Maus bewegt wird, werden ein x und ein y wert relativ zur mitte des bildes gespeichert.
(=> Maus in der Mitte -> Wert X==0 Y==0)
Anhand dieser Koordinaten und des Mittelpunktes (hab ich nur in pixeln) läst sich der Vektor berechnen.
Der Standartvektor ist praktisch die Y-achse eines koordinatensystems -> (0,1)
Die Rechnung sollte(?) stimmen, um einen Winkel rauszubekommen.
Das bei mehrmaliger Ausführung das ganze nicht hinhaut(und ist auch ein Spiel - dazu wird es kommen) weiß ich , aber ist nicht mein hauptproblem, das krieg ich dann schon hin, was mich wundert ist das ich keine Winkel <80 bekomme z.b. und teilweise ein NaN (Not a Number) beim double-wert des winkels.
Hier der (hoffentlich ausreichende) quellausschnitt:
Java:
public void doLogic(long delta){
super.doLogic(delta);
//ROTATE PLAYER IF THETA != 0
if(moved){
playersight=new Vektor(xsight,ysight);
//COMPUTE THETA!
double a = (playersight.getX()*standartsight.getX()+playersight.getY()*standartsight.getY())/
(Math.sqrt(playersight.getX()*playersight.getX()+playersight.getY()+playersight.getY())*Math.sqrt(standartsight.getX()*standartsight.getX()+standartsight.getY()*standartsight.getY()));
theta=Math.acos(Math.toRadians(a));
System.out.println(Math.toDegrees(theta));
rotatedplayer = rotateImage(player,10);
moved=false;
}else
rotatedplayer = player;
DER GESAMTE CODE (der relevanten Klasse - für alle Fälle):
Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
public class Player
extends Sprite implements MouseMotionListener{
private static final long serialVersionUID = 1L;
int speed = 60;
Game p;
BufferedImage player;
BufferedImage rotatedplayer;
Graphics2D playergraphics;
Vektor standartsight;//(p.getWidth()/2)+2,(p.getHeight()/2)+8+1); = new Vektor(0,1);
Vektor oldplayersight;
Vektor playersight;
double xsight,ysight;
boolean moved=false;
double theta=10;
public Player(BufferedImage[] i, double x, double y, long delay, Game p) {
super(i, x, y, delay, p);
this.p=p;
p.frame.addMouseMotionListener(this);
standartsight =new Vektor(0,1);
player = pics[currentpic];
}
public void doLogic(long delta){
super.doLogic(delta);
//ROTATE PLAYER IF THETA != 0
if(moved){
playersight=new Vektor(xsight,ysight);
//COMPUTE THETA!
double a = (playersight.getX()*standartsight.getX()+playersight.getY()*standartsight.getY())/
(Math.sqrt(playersight.getX()*playersight.getX()+playersight.getY()+playersight.getY())*Math.sqrt(standartsight.getX()*standartsight.getX()+standartsight.getY()*standartsight.getY()));
theta=Math.acos(Math.toRadians(a));
System.out.println(Math.toDegrees(theta));
rotatedplayer = rotateImage(player,10);
moved=false;
}else
rotatedplayer = player;
}
public void drawObjects(Graphics g) {
//Player kriegt fixe x,y werte zum anzeigen!
g.drawImage(rotatedplayer, (int) (p.getWidth()/2-getWidth()/2), (int) (p.getHeight()/2-getHeight()/2), null);
player= rotatedplayer;
}
private static BufferedImage rotateImage(BufferedImage src, double degrees) {
AffineTransform affineTransform = AffineTransform.getRotateInstance(
Math.toRadians(degrees),
src.getWidth() / 2,
src.getHeight() / 2);
BufferedImage rotatedImage = new BufferedImage(src.getWidth(), src
.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) rotatedImage.getGraphics();
g.setTransform(affineTransform);
g.drawImage(src, 0, 0, null);
return rotatedImage;
}
@Override
public void mouseDragged(MouseEvent arg0) {
}
@Override
public void mouseMoved(MouseEvent arg0) {
moved = true;
xsight = arg0.getX()-(p.getWidth()/2)+2;
ysight = arg0.getY()-(p.getHeight()/2)+8;
System.out.println("Mouse move detected!("+xsight+"|"+ysight+")");
}
}
PS: Sorry für 2 quelltexte, aber offensichtlich ging der spoilerbutton nicht in diesem forum/hab ihn nicht gefunden :x
MfG
Ribbley!