tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von RoCMe
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
981
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    anfängerregnäfna anfängerregnäfna ist offline Mitglied Silber
    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;
            }
        }
     

  2. #2
    Avatar von mccae
    mccae mccae ist offline Senfdazugeber
    Registriert seit
    Dec 2007
    Ort
    Wien
    Beiträge
    226
    Zitat Zitat von anfängerregnäfna Beitrag anzeigen
    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 java:
    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
     

  3. #3
    RoCMe RoCMe ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Beiträge
    193
    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
    anfängerregnäfna bedankt sich. 

Ähnliche Themen

  1. Objekt lässt sich in Animation nicht skalieren!
    Von realitaetsfern im Forum Cinema 4D
    Antworten: 8
    Letzter Beitrag: 11.07.09, 17:22
  2. Antworten: 8
    Letzter Beitrag: 11.11.07, 12:54
  3. Es lässt sich nicht mehr um das Objekt herumdrehen
    Von JeanClaudeVanDamme im Forum 3D Studio Max
    Antworten: 4
    Letzter Beitrag: 16.10.04, 19:27
  4. Objekt lässt sich nicht mehr drehen
    Von Bong im Forum Cinema 4D
    Antworten: 5
    Letzter Beitrag: 03.08.04, 00:21
  5. text lässt sich nur schwer bewegen
    Von mR.fLopPy im Forum Photoshop
    Antworten: 6
    Letzter Beitrag: 17.03.02, 13:09

Stichworte