ホームページ >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 バウンス ボール

問題:

フレームの端から跳ね返る複数のボールを画面上に描画する場合、2 番目のボールが最初のボールを上書きします。

与えられたコード:

提供されたコードは複数の跳ねるボールを描画しようとしますが、2 番目のボールが最初のボールを上書きします。

現在のアプローチでは、次の問題が存在します。

  • 不透明なコンポーネントがそれぞれの上に配置されますその他。
  • レイアウト マネージャーが指定されていないため、ボールの配置に影響します。
  • ボールのサイズと位置の制御は効果的に処理されません。
  • 速度
  • ボールの更新は、 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() メソッドは、それぞれの新しい位置を計算します。 ball.
  • draw() メソッドは、ボールを塗りつぶされた円としてレンダリングします。

以上がJavaで複数の跳ねるボールを重複せずに効率的にアニメーション化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。