1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
2
2
ZUGRIFFE
981
981
EMPFEHLEN
-
07.11.09 21:03 #1
- Registriert seit
- May 2009
- Beiträge
- 88
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:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
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; } }
-
Huhu,
Zuerst einmal würde ich dich bitten java statt code tags zu benutzen
Hast du denn bis jetzt Versuche gemacht nach dem Problem zu suchen?
Bist du mit dem Debugger Breakpoint für Breakpoint (Ich nehme an du hast welche gesetzt) durchgegangen und hast geschaut ob alles passt?
Falls nicht, solltest du das tun.
Ich zumindest finde dann meistens die Problemursache und muss keinen Thread à la: "Hilfe es geht nicht, ich habs mehrmals durchgelesen, finde den Fehler nicht" öffnen :P
-
Hallo!
mccae hat Recht - eigentlich müsstest du erst mal selbst anfangen zu suchen. Mit einem Debugger finde ich das aber ziemlich ungemütlich, wenn es um GUI basierte Dinge geht. System.out.println() hat mich hier schneller zum Ziel geleitet:
Du erzeugst einen neuen Thread, aber gestartet wird der nicht - nur erzeugt. Das führt dann dazu, dass nichts neugezeichnet wird...
Wenn man den Thread an der Stelle, wo er erzeugt wird, mit "a.start();" startet, gibts eine nullPointer Exception. Aber da darfst du jetzt selbst weitersuchen ;-p
Gruß,
RoCMe
Ähnliche Themen
-
Objekt lässt sich in Animation nicht skalieren!
Von realitaetsfern im Forum Cinema 4DAntworten: 8Letzter Beitrag: 11.07.09, 17:22 -
Lücke lässt sich nicht Schließen bei Symmetrie Objekt
Von jackie05 im Forum Cinema 4DAntworten: 8Letzter Beitrag: 11.11.07, 12:54 -
Es lässt sich nicht mehr um das Objekt herumdrehen
Von JeanClaudeVanDamme im Forum 3D Studio MaxAntworten: 4Letzter Beitrag: 16.10.04, 19:27 -
Objekt lässt sich nicht mehr drehen
Von Bong im Forum Cinema 4DAntworten: 5Letzter Beitrag: 03.08.04, 00:21 -
text lässt sich nur schwer bewegen
Von mR.fLopPy im Forum PhotoshopAntworten: 6Letzter Beitrag: 17.03.02, 13:09





Zitieren
Login





