why my code “Bouncing ball” doesn't work?

后端 未结 3 832
南方客
南方客 2020-12-11 14:15

I\'m trying to write a code a bout a bouncing ball, but i\'m stuck in how to make the ball bounced. The code seems correct, no wrong messages from eclipse and yet the ball d

相关标签:
3条回答
  • 2020-12-11 14:54

    Basically, nothing is moving the ball.

    Each time the Swing Timer ticks, all you do is repaint.

    You need to move the movement logic to the actionPerformed method of the ActionListener registered to the Timer

    More like...

    public void StartBouncingBallTest() {
        timer.start();
    }
    
    //...
    
    class TimerListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (x > 0 && y > 0) {
                x += dx;
                y += dy;
            }
    
            else if (x == 0) {
                x -= dx;
                y += dy;
            }
    
            else if (y + (2 * radius) > getHeight()) {
                x += dx;
                y -= dy;
            }
    
            else if (y == 0) {
                x += dx;
                y -= dy;
            }
    
            else if (x + (2 * radius) > getWidth()) {
                x -= dx;
                y += dy;
            }
            repaint();
        }
    }
    

    This way, each time the Timer ticks, you are making update the position of the ball accordingly...

    Updated with working example

    I made two changes. I made your TimerListener an inner class of Ball, which allows it to access the variable and methods of Ball and modified your movement logic so it works

    Bounce

    class Ball extends JPanel {
    
        private int radius = 10;
        private int x;
        private int y;
        private int dx = 3;
        private int dy = 3;
    
        private Timer timer = new Timer(20, new TimerListener());
    
        public void StartBouncingBallTest() {
    
            timer.start();
    
        }
    
        public void StopBouncingBallTest() {
    
            timer.stop();
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.GREEN);
            g.fillOval(x, y, 2 * radius, 2 * radius);
    
        }
    
        class TimerListener implements ActionListener {
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
                if (x < 0 || x + (2 * radius) > getWidth()) {
                    dx *= -1;
                }
                if (y < 0 || y + (2 * radius) > getHeight()) {
                    dy *= -1;
                }
    
                x += dx;
                y += dy;
                repaint();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-11 14:56
    private Timer timer = new Timer(20, new TimerListener());
    

    doesn't that new TimerListener() need to do something useful? shouldn't most of the code inside StartBouncingBallTest be happening every time the timer ticks, intsead of just once when the timer starts?

    0 讨论(0)
  • 2020-12-11 15:00

    you never declared that the g.fillOval was the ball here do this...

    g.drawOval((int)applex, (int)appley, (int)appleradius, appleradius);
      public double applex = ArandomX; //replace the random with values..
        public double appley = ArandomY; //same here
        public int appleradius = 10;
    

    this makes it move...

    a.px += a.vx;
            // check for boundaries
            if (a.px >= this.getWidth() || a.px <= 0) {
                // reverse vel and apply
                a.vx = -a.vx;
                a.px += -a.vx; // to prevent sticking
            }
    
            //a.vx += -gravity; // add this constant to accelerate things down
            a.py += a.vy;
            // check for boundaries
            if (a.py >= this.getHeight() || a.py <= 0) {
                // reverse vel and apply
                a.vy = -a.vy;
                a.py += a.vy; // to prevent sticking
            }`
    

    replace a.vx with your x or dx idk because your variables are unclear and yeah just replace a.vy with either y or dy and do the same for my px... it will work

    0 讨论(0)
提交回复
热议问题