ホームページ >Java >&#&チュートリアル >Javaで複数の跳ねるボールを重複せずに効率的にアニメーション化するにはどうすればよいですか?
問題:
フレームの端から跳ね返る複数のボールを画面上に描画する場合、2 番目のボールが最初のボールを上書きします。
与えられたコード:
提供されたコードは複数の跳ねるボールを描画しようとしますが、2 番目のボールが最初のボールを上書きします。
現在のアプローチでは、次の問題が存在します。
複数のスレッドのスケーラビリティの問題:
現在のアプローチでは、ボールごとに個別のスレッドを作成する必要があります。これにより、特にボールの数が増加した場合に、システム リソースに負担がかかる可能性があります。
代替アプローチ:
各ボールにコンポーネントを使用する代わりに、ボール用のコンテナを作成することを検討してください。そして、単純なアニメーション ループを使用して位置を更新し、再描画します。このアプローチはよりスケーラブルです。
実装:
上記の問題に対処する代替実装を次に示します。
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 中国語 Web サイトの他の関連記事を参照してください。