首頁 >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