問題:
在螢幕上繪製多個從框架邊緣彈起的球時,第二個球會覆蓋第一個球。
給定程式碼:
提供的程式碼嘗試繪製多個彈跳球,但第二個球覆蓋了初始球。
使用目前方法,存在以下問題:
多執行緒的可擴展性問題:
目前的方法涉及為每個球創建一個單獨的執行緒。這可能會導致系統資源緊張,尤其是當球的數量增加時。
替代方法:
不要為每個球使用組件,而是考慮為球創建一個容器並使用一個簡單的動畫循環來更新它們的位置並重新繪製它們。這種方法更具可擴展性。
實作:
這是解決上述問題的替代實作:
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中文網其他相關文章!