tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
407
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    safin23 safin23 ist offline Rookie
    Registriert seit
    Dec 2007
    Beiträge
    8
    Hallo!
    Ich versuche nun seit Stunden meinen Denkfehler zu finden.
    Dem Ball wird eine Richtung gegeben und danach soll er weiter rollen.
    Wenn er auf die Bande kommt - prallt er ab ( Einfallswinkel = Ausfallswinkel).
    Das Problem bei mir - er wird an der Bande immer mitgeschoben...
    Was mache ich falsch
    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
    
    import javax.swing.*;
    import java.awt.*;
     
    public class Table extends JPanel implements Runnable{
        
        
        private Ball ball = new Ball(0,0);
        private int x,y;
        private int zähler=0;
        
        
        public void setNewBallPos(){
            ball.setPx(0);
            ball.setPy(getHeight()/2);
            repaint();
        }
        
        public void setX(int Px){
            x = Px;
        }
        
        public void setY(int Py){
            y = Py;
        }
        
        
        public void paint(Graphics g){
            g.setColor(Color.pink);
            g.fillRect(0, 0, getWidth(), getHeight());
            ball.displayMe(g);
     
            
        }
        
        public void run(){
                            
            while(zähler<11)
            {
     
                // if für x-Koordinate
                if (ball.getPx()+x < 0 || ball.getPx()+x+20 > getWidth()){
                    if(ball.getPx()+x < 0){
                        ball.setPx(0);
                    }
                    else{
                        ball.setPx(getWidth()-20);
                        ball.changePosY(y);
                    }
                    
                    x = -x;
                    zähler++;
                }
                else{
                    ball.changePosX(x);
                }
                // if für y-Koordinate
                if(ball.getPy()+y < 0 || ball.getPy()+y+20 > getHeight()){
                    if(ball.getPy()+y < 0){
                        ball.setPy(0);
                    }
                    else{
                        ball.setPy(getHeight()-20);
                        ball.changePosX(x);
                    }
                    y = -y;
                    zähler++;
                }
                else{
                    ball.changePosY(y);
                }
                
                
                repaint();
                try{
                    Thread.sleep(800);
                }
                catch(InterruptedException e){}
            }
            
        }
        
        Ball getBall(){
            return ball;
        }
        
    }
    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
    
    import java.awt.*;
    //import javax.swing.*;
     
    public class Ball {
        
        private int Px, Py;
        
        
        Ball(int x, int y){
            Px = x;
            Py = y;
            
        }
        
        
        void changePosX(int x){
            Px += x;
        }
        
        void changePosY(int y){
            Py += y;
        }
        
        
        void displayMe(Graphics g){
            g.setColor(Color.cyan);
            
            //variabel machen
            g.fillOval(Px, Py, 20, 20);
        }
     
        public int getPx() {
            return Px;
        }
        
        public int getPy() {
            return Py;
        }
     
        public void setPy(int py) {
            Py = py;
        }
     
        public void setPx(int px) {
            Px = px;
        }
        
    }

    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
    
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class Billiard extends JApplet implements ActionListener, MouseListener{
     
        private static final long serialVersionUID = 1L;
        private JTextField textUnten, textRechts;
        private JButton start;
        private JLabel unten, rechts;
        private Table tisch = new Table();
        private int zahlUnten, zahlRechts;
        
        
        public void threadstart(){
            Thread thread = new Thread(tisch);
            thread.start();
        }
        
        public int getZahlunten(){
            return zahlUnten;
        }
     
        public int getZahlrechts(){
            return zahlRechts;
        }
        
        
        public void actionPerformed(ActionEvent e){
            if(e.getActionCommand().equals("Start")){
                
                zahlUnten = Integer.parseInt(textRechts.getText());
                zahlRechts = Integer.parseInt(textUnten.getText());
                tisch.setX(zahlUnten);
                tisch.setY(zahlRechts);
                this.threadstart();
                
            }
        }
        
        
        public void init(){
     
            JPanel panelunten = new JPanel();
            this.setSize(800, 400);
            this.setLayout(null);
            
            // Objekte erzeugen
            textUnten = new JTextField("2",5);
            textRechts = new JTextField("3",5);
            unten = new JLabel("unten:");
            rechts = new JLabel("rechts:");
            start = new JButton("Start");
     
            
            //Tisch zeichnen
            getContentPane().add(tisch);
            tisch.setBounds(getWidth()/4, getHeight()/4, getWidth()/2, getHeight()/2);
            start.addActionListener(this);
            
            panelunten.add(textUnten);
            panelunten.add(unten);
            panelunten.add(textRechts);
            panelunten.add(rechts);
            panelunten.add(start);
            
            panelunten.setLayout(new FlowLayout());
            panelunten.setBounds(0,getHeight()-40,getWidth(),40);
            getContentPane().add(panelunten);
            
            
        }
        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub  
        }
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub      
        }
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub  
        }
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub
        }
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub  
        }
    }
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Was meinst du? Dass der Ball an der Bande immer einmal langwandert bevor er wieder abprallt?

    Hab mal deine Ball-Klasse ein wenig verändert:
    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
    
    package de.tutorials;
    import java.awt.*;
    //import javax.swing.*;
     
    public class Ball {
        
        private int Px, Py;
        
        
        Ball(int x, int y){
            setPx(x);
            setPy(y);
        }
        
        
        void changePosX(int x){
            setPx(getPx()+x);
        }
        
        void changePosY(int y){
            setPy(getPy()+y);
        }
        
        
        void displayMe(Graphics g){
            g.setColor(Color.cyan);
            
            //variabel machen
            g.fillOval(Px, Py, 20, 20);
        }
     
        public int getPx() {
            return Px;
        }
        
        public int getPy() {
            return Py;
        }
     
        public void setPy(int py) {
            Py = py;
            System.out.println("y: " + py);
        }
     
        public void setPx(int px) {
            Px = px;
            System.out.println("x: " + px);
        }
        
    }

    Schau mal auf die Koordinaten-Angaben.. auch in deinem Code sieht man das ganz gut:
    Code java:
    1
    2
    3
    
    if(ball.getPy()+y < 0){
        ball.setPy(0);
    }

    Ich denke richtig müßte es heißen:
    Code java:
    1
    2
    3
    4
    
    int newY = ball.getPy()+y;
    if(newY < 0){
        ball.setPy(y-Math.abs(newY));
    }

    Er soll ja abprallen sobald er auftrifft und nicht erst einen Schritt später.
     

  3. #3
    safin23 safin23 ist offline Rookie
    Registriert seit
    Dec 2007
    Beiträge
    8
    Irgendwie verstehe ich es nicht... An welcher Stelle soll ich deinen Code plazieren?
    Soll ich es überall neu machen oder nur an einer bestimmten Stelle?
    Wäre nett, wenn du es mir gena zeigst...

    lg
     

Ähnliche Themen

  1. Kugel rollen lassen
    Von taylorlibbe im Forum Cinema 4D
    Antworten: 16
    Letzter Beitrag: 26.12.10, 00:08
  2. VB 2008 Ball über eine Schräge rollen lassen
    Von Taquar im Forum .NET Grafik und Sound
    Antworten: 4
    Letzter Beitrag: 24.02.10, 18:47
  3. kugel rollen lassen
    Von chanicua im Forum Cinema 4D
    Antworten: 1
    Letzter Beitrag: 29.05.07, 14:14
  4. Ball physikahlisch rollen lassen
    Von csfungamer im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 27.12.05, 11:00
  5. Ball--> realistisch rollen
    Von ponda im Forum 3D Studio Max
    Antworten: 2
    Letzter Beitrag: 14.08.03, 22:04