Home >Java >javaTutorial >How to Efficiently Animate Multiple Bouncing Balls in Java Without Overlapping?
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:
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:
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!