首页 >Java >java教程 >如何在 Java 中高效地制作多个弹跳球的动画而不重叠?

如何在 Java 中高效地制作多个弹跳球的动画而不重叠?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-09 15:36:12932浏览

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

Java 弹跳球

问题:

在屏幕上绘制多个从框架边缘弹起的球时,第二个球会覆盖第一个球。

给定代码:

提供的代码尝试绘制多个弹跳球,但第二个球覆盖了初始球。

使用当前方法,存在以下问题:

  • 不透明组件放置在每个组件的顶部其他。
  • 未指定布局管理器,影响球的放置。
  • 未有效处理球的大小和位置的控制。
  • 速度球的位置和位置不是随机的。
  • 球的更新应在EDT。
  • X/Y 值不是必需的,因为可以使用面板。

多线程的可扩展性问题:

当前的方法涉及为每个球创建一个单独的线程。这可能会导致系统资源紧张,尤其是当球的数量增加时。

替代方法:

不要为每个球使用组件,而是考虑为球创建一个容器并使用一个简单的动画循环来更新它们的位置并重新绘制它们。这种方法更具可扩展性。

实现:

这是解决上述问题的替代实现:

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);
        }

    }

}

在此替代实现中:

  • 单个动画循环更新所有球。
  • 球由简单的数据结构(而不​​是组件)表示。
  • 动画循环处理帧边缘的边界。
  • 随机化用于改变球的起始速度和位置。
  • update() 方法计算每个球的新位置球。
  • draw() 方法将球渲染为实心圆。

以上是如何在 Java 中高效地制作多个弹跳球的动画而不重叠?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn