# Sprite zur Maus bewegen



## Dagobert (11. Sep 2009)

Die Überschift sagt eigentlich alles.
Ich versuche gerde mein Sprite bis zur Maus entlang laufen zu lassen, leider weis ich nicht ganz wie ich das anstellen soll.
Ich habe die Funktion Linie2D gefunden. Eine Linie ist ja nichts anderes als eine Gerade, lassen sich damit auch Funktionswerte bestimmen?
Falls nicht bleibt mir ja immer noch die Funktion manuel zu berechnen mit den zwei Punkten die ich habe (Sprite und Maus). Jedoch klappt das leider nicht vllt. übersehe ich gerade ein Fehler in meiner Formel:
[Java]
public void update(long elapsedTime){
super.update(elapsedTime);

if(target != null){
	double m = (target.getY() - getY()) / (target.getX() - getX());
	double b = -m * getX() + getY();

	setVelocityX(0.05F);

	setY(Math.round(m*getX()+b));
	if(getX() == target.getX()){
		target = null;
		setVelocityX(0);
	}

	if(getVelocityX() > 0){
	setAnim(right);
}
}[/Java]
oder ich muss X/Y irgendwie anders Setzen 

mfg. Dagobert


----------



## Quaxli (11. Sep 2009)

Mal auf die Schnelle zusammengeschustert:


```
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import javax.swing.*;
import java.awt.*;

public class Test extends JPanel implements MouseMotionListener, Runnable{


	private static final long	serialVersionUID	= 1L;
	JFrame frame;
	Point point;
	Hunter hunter;
	double angle = 0;

	public static void main(String[] args) {
		new Test();
	}

	public Test() {
		hunter = new Hunter();
		point = new Point(0,0);

		setPreferredSize(new Dimension(800,600));
		addMouseMotionListener(this);
		
    frame = new JFrame("MouseHunter");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		
		Thread t = new Thread(this);
		t.start();
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		Graphics2D g2 = (Graphics2D)g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		hunter.paintHunter(g2);
		
	}

	
	public void run() {
		
		long last = System.nanoTime();
		long delta = 0;
		
		while(frame.isVisible()){
			
			delta = System.nanoTime() - last;
			last = System.nanoTime();
			hunter.move(delta);
			
			computeAngle();
			hunter.setDirection(angle);
			
      try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
      repaint();
			
		}
		
	}

	private void computeAngle(){
		
		double diffx = point.x - (hunter.x + hunter.width/2);
		double diffy = point.y - (hunter.y + hunter.height/2);
				
		angle = Math.toDegrees(Math.atan((diffy/diffx)));
	  angle += 90;
	  
	  if(diffx<0){
	  	angle += 180;
	  }
	  
	  
	  if(angle<0){
	  	angle+= 360;
	  }
		
	}
	
	

	public void mouseDragged(MouseEvent e) {
		
	}

	public void mouseMoved(MouseEvent e) {
	  point = e.getPoint();
	}


}

class Hunter extends Rectangle2D.Double {
	
	double dx = 0;
	double dy = 0;
	double speed = 150;
	
	public Hunter(){
		super(395,295,10,10);
	}
	
	public void move(long delta) {
		
    if(dx!=0){
      x += dx*(delta/1e9);
    }
    
    if(dy!=0){
      y += dy*(delta/1e9);
    }
		
	}

	public void setDirection(double angle) {
	
		dy = Math.cos(Math.toRadians(angle)) * speed * -1;
		dx = Math.sin(Math.toRadians(angle)) * speed; 
		
	}

	public void paintHunter(Graphics g){
		g.setColor(Color.RED);
		g.fillOval((int)x,(int)y,(int)width,(int)height);
	}
	
	
}
```


----------



## Dagobert (11. Sep 2009)

Ich merk schon ich war schon wieder komplett auf dem Holzweg, kann das sein?  Ich werde mir gleich mal dein Beispiel angucken und gucken was das alles für Mathematische Dinger sind  und bei Fragen mich wieder Melden


----------



## Quaxli (11. Sep 2009)

Dagobert hat gesagt.:


> .. und bei Fragen mich wieder Melden



Oder Du schreibst hier was rein. Bevor Du mit erhobenem Arm vor dem PC sitzt und nix passiert.


----------



## Dagobert (11. Sep 2009)

> Oder Du schreibst hier was rein. Bevor Du mit erhobenem Arm vor dem PC sitzt und nix passiert.


wie meinst du das? Willst du damit sagen das ich selber mehr nachdenken soll? 
Ich hab doch nicht erwartet das du mir wieder so eine ausfühliche Lösung presäntierst  (torzdem danke, ist echt besser so zu verstehen). Ich wollte doch nur ein Denkanstoß wie das Funktionieren könnte (oder warum es ebend nicht funktioniert) und welche mathematischen Mittel es dafür in Java gibt 
Ich sollte mir echt mal die Math API angucken bevor ich alle Rechensachen selber tippe 

mfg. Dagobert


----------



## Painii (12. Sep 2009)

Dagobert hat gesagt.:


> wie meinst du das? Willst du damit sagen das ich selber mehr nachdenken soll?



Ich hätte es eher verstanden dass er dachte du meldest dich wie in der Schule - Hand heben bis der Lehrer dir gestattet zu sprechen


----------



## Dagobert (12. Sep 2009)

erinner mich blos nicht an die Schulzeit 
Ich bin froh das das vorbei ist und ab Oktober ins Sutdium geht


----------



## Dagobert (12. Sep 2009)

So dann komme ich mal wieder zurück aufs Thema:

Ich habe das ganze mal manuel veranschaulicht (siehe Anhang)
Ich habe die Distanz d zwischen den beiden Punkten mit dem Phytagoras bestimmt. Dannach wird der Winkel an s mithilfe des Tangens o.a bestimmt. Da jedoch das KS des Computers gedreht ist werde nochmal 90° (richtig ??? oO) addiert um auf den eigentlichen Winkel zu kommen der für das Com. KS richtig ist. Dannach wird der Winkel in Bogenmaß umgerechnet. Dy wird dann dadruch berechnet indem man den Bogenmaß mal die Geschwindigkeit setzt. (Wofür ist das -1 da gut?) Dy gibt die Pixelversetzung von y pro GameLoop an. Das gleiche wird für die X-Koordinate auch noch gemacht. Wobei dx die Pixelversetzung von x pro GameLoop angibt.
Ist das soweit richtig?

Jedoch möchte ich jetzt auch noch den Weg angeben den der Sprite bis zum aktuellen Augenblick zurück gelegt hat. Ich hatte gedacht ich müsste einfach 

```
weg += dx*delta+dy*delta
```
 rechnen, aber dem ist offensichtlich nicht so. Warum? 

mfg. Dagobert


----------



## andre111 (12. Sep 2009)

Eventuell:

```
weg += Math.sqrt(dx*delta+dy*delta);
```


----------



## Quaxli (14. Sep 2009)

Das mit dem "Melden" sollte ein sprachlicher Witz sein. Ist wohl nicht so angekommen... 




Dagobert hat gesagt.:


> ...
> Ich habe die Distanz d zwischen den beiden Punkten mit dem Phytagoras bestimmt. Dannach wird der Winkel an s mithilfe des Tangens o.a bestimmt. Da jedoch das KS des Computers gedreht ist werde nochmal 90° (richtig ??? oO) addiert um auf den eigentlichen Winkel zu kommen der für das Com. KS richtig ist.



Nö, das kommt daher, daß ich eigentlich den falschen Winkel berechne...
Genau, der andere solltete es sein. Mit dem KS des Computers hat das ja eigentlich nix zu tun. Da habe ich es mir etwas einfacher gemacht, weil das Ganze auf die Schnelle geproggt war.



Dagobert hat gesagt.:


> Dannach wird der Winkel in Bogenmaß umgerechnet. Dy wird dann dadruch berechnet indem man den Bogenmaß mal die Geschwindigkeit setzt. (Wofür ist das -1 da gut?) Dy gibt die Pixelversetzung von y pro GameLoop an. Das gleiche wird für die X-Koordinate auch noch gemacht. Wobei dx die Pixelversetzung von x pro GameLoop angibt.



Das Bogenmaß ist notwendig, weil die Winkelfunktionen in Java Winkel im Bogenmaß erwarten bzw. liefern.
Das -1 ist diesmal wirklich dafür da, das KS umzudrehen, da in Y-Richtung Null am oberen Bildschirmrand ist.


----------

