问题:
在屏幕上绘制多个从框架边缘弹起的球时,第二个球会覆盖第一个球。
给定代码:
提供的代码尝试绘制多个弹跳球,但第二个球覆盖了初始球。
使用当前方法,存在以下问题:
多线程的可扩展性问题:
当前的方法涉及为每个球创建一个单独的线程。这可能会导致系统资源紧张,尤其是当球的数量增加时。
替代方法:
不要为每个球使用组件,而是考虑为球创建一个容器并使用一个简单的动画循环来更新它们的位置并重新绘制它们。这种方法更具可扩展性。
实现:
这是解决上述问题的替代实现:
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); } } }
在此替代实现中:
以上是如何在 Java 中高效地制作多个弹跳球的动画而不重叠?的详细内容。更多信息请关注PHP中文网其他相关文章!