anfängerregnäfna
Mitglied
Ich habe gerade ein Java-Programm geschrieben. Es stellt einen roten Kreis in einem Fenster dar, den man mit der Maus anstoßen kann. Der Ball soll sich bewegen und an den Fensterrändern abprallen. Das Programm ist fertig und der Kreis wird auch dargestellt, leider kann man ihn nicht bewegen. Ich finde meinen Fehler nicht, kann mir jemand helfen?
Der Quellcode lautet:
Der Quellcode lautet:
Code:
package mousecollision;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
/**
*
* @author lars
*/
public class Main extends JFrame{
Ball dot;
double x; //aktuelle Mauskoordinaten
double y; //aktuelle Mauskoordinaten
double ox;//alte Mauskoordinaten
double oy;//alte Mauskoordinaten
public static int auflosung=500;//größe des Fenster
public Main()
{super("Mause-Kollision");
setSize(auflosung,auflosung);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
dot=new Ball();
dot.ref=this;
addMouseMotionListener(new mouse());}
class mouse implements MouseMotionListener
{
public void mouseMoved(MouseEvent me)
{ox=x; oy=y; x=me.getX(); y=me.getY();//koordinaten erneuern
if(dot.collision(x, y)) //wenn eine Kollision vorliegt
{dot.movex=(x-ox); dot.movey=(y-oy);} //geschwindigkeit des Ball anpassen. Je größer der unterschied zwischen den alten und den neuen Mauskoordinaten ist, desto schneller wird der Ball
}
public void mouseDragged(MouseEvent me){}//unnötig
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Main test=new Main();
}
public void paint(Graphics g)
{g.clearRect(0, 0, auflosung, auflosung);
g.setColor(Color.red);
g.drawOval((int) dot.x, (int) dot.y, (int) dot.rad, (int) dot.rad);}//ball zeichnen
}
class Ball
{
public Main ref;
public double rad=10; //radius
public double x=50; //absolute kords
public double y=50; //absolute kords
public double movex=1; //per ms
public double movey=1; //per ms
Thread a;
public double start=0; //zeit um die geschwindigkeit des Balls konstant zu halten
public double stop=0;
public double speed=5;
class Movement implements Runnable
{public void run()
{stop=System.currentTimeMillis();
double difference=stop-start;
start=System.currentTimeMillis();
x+=movex*difference/speed;//ball bewegen
y+=movey*difference/speed;
//kontrollieren ob der Ball noch im Fenster liegt. Mit etwas Spielraum versehen
if(x<rad){x=rad; movex=-movex;}
if(y<rad){y=rad; movey=-movey;}
if(x>(Main.auflosung-rad)){x=Main.auflosung-rad; movex=-movex;}
if(y>(Main.auflosung-rad)){y=Main.auflosung-rad; movey=-movey;
//fenster und ball neu zeichnen
ref.repaint();}
}
}
public Ball()
{
//der Thread sorgt dafür, dass der ball sich ständig bewegt.
a=new Thread(new Movement());}
//wird aufgerufen, wenn die Mauskoordinaten in Main abgefragt werden. liegt eine Kollision vor, so wird die Geschwindigkeit vom Ball geändert.
public boolean collision(double x, double y)
{
double dx=this.x-x;
double dy=this.y-y;
double distance=Math.sqrt(Math.pow(dx, 2)+Math.pow(dy, 2));
if(distance<=10)return true;
return false;
}
}