Home >Java >javaTutorial >How to Efficiently Animate Multiple Bouncing Balls in Java Without Overlapping?

How to Efficiently Animate Multiple Bouncing Balls in Java Without Overlapping?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-09 15:36:12932browse

How to Efficiently Animate Multiple Bouncing Balls in Java Without Overlapping?

Java Bouncing Ball

Problem:

When drawing multiple balls on the screen that bounce off the edges of the frame, the second ball overwrites the initial ball.

Given Code:

The provided code attempts to draw multiple bouncing balls, but the second ball overwrites the initial ball.

With the current approach, the following issues are present:

  • Opaque components are placed on top of each other.
  • A layout manager isn't specified, which affects the placement of the balls.
  • The control of the ball's size and location is not handled effectively.
  • Speed and location of the balls aren't randomized.
  • Updates of the ball should be performed within the context of the EDT.
  • X/Y values aren't necessary, as the panels can be used.

Scalability Issues with Multiple Threads:

The current approach involves creating a separate thread for each ball. This can strain system resources, especially when the number of balls increases.

Alternative Approach:

Instead of using components for each ball, consider creating a container for the balls and using a simple animation loop to update their positions and redraw them. This approach is more scalable.

Implementation:

Here's an alternative implementation that addresses the issues mentioned above:

public class AnimatedBalls {

    public static void main(String[] args) {
        new AnimatedBalls();
    }

    public AnimatedBalls() {
        EventQueue.invokeLater(() -> {
            JFrame frame = new JFrame("Bouncing Balls");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 400);
            frame.setVisible(true);

            // Create a container for the balls
            BallsPane ballsPane = new BallsPane();
            frame.add(ballsPane);
        });
    }

    public class BallsPane extends JPanel {

        private List<Ball> balls;

        public BallsPane() {
            balls = new ArrayList<>();

            for (int i = 0; i < 10; i++) {
                Random random = new Random();
                int x = (int) (Math.random() * getWidth());
                int y = (int) (Math.random() * getHeight());
                int vx = (int) (Math.random() * 10) - 5;
                int vy = (int) (Math.random() * 10) - 5;
                Ball ball = new Ball(x, y, vx, vy);
                balls.add(ball);
            }
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            for (Ball ball : balls) {
                ball.draw(g);
            }
        }

    }

    public class Ball {

        private int x;
        private int y;
        private int vx;
        private int vy;

        public Ball() {
            this(0, 0, 0, 0);
        }

        public Ball(int x, int y, int vx, int vy) {
            this.x = x;
            this.y = y;
            this.vx = vx;
            this.vy = vy;
        }

        public void update() {
            // Bounce off the edges of the frame
            if (x < 0 || x > getWidth())
                vx *= -1;
            if (y < 0 || y > getHeight())
                vy *= -1;

            // Update the ball's position
            x += vx;
            y += vy;
        }

        public void draw(Graphics g) {
            // Draw the ball as a filled circle
            g.setColor(Color.RED);
            g.fillOval(x - 5, y - 5, 10, 10);
        }

    }

}

In this alternative implementation:

  • A single animation loop updates all the balls.
  • The balls are represented by simple data structures (not components).
  • The animation loop handles bounding off the edges of the frame.
  • Randomization is used to vary the starting speed and location of the balls.
  • The update() method calculates the new position of each ball.
  • The draw() method renders the ball as a filled circle.

The above is the detailed content of How to Efficiently Animate Multiple Bouncing Balls in Java Without Overlapping?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn