Heim >Java >javaLernprogramm >Wie animiere ich mehrere springende Bälle in Java effizient, ohne sie zu überlappen?
Problem:
Beim Zeichnen mehrerer Bälle auf dem Bildschirm, die von den Rändern des Rahmens abprallen , der zweite Ball überschreibt den ersten Ball.
Gegeben Code:
Der bereitgestellte Code versucht, mehrere springende Bälle zu zeichnen, aber der zweite Ball überschreibt den ersten Ball.
Beim aktuellen Ansatz treten die folgenden Probleme auf:
Skalierbarkeitsprobleme mit mehreren Threads:
Der aktuelle Ansatz besteht darin, für jeden Ball einen separaten Thread zu erstellen. Dies kann die Systemressourcen belasten, insbesondere wenn die Anzahl der Bälle zunimmt.
Alternativer Ansatz:
Anstatt Komponenten für jeden Ball zu verwenden, sollten Sie erwägen, einen Behälter für die Bälle zu erstellen und Verwenden einer einfachen Animationsschleife, um ihre Positionen zu aktualisieren und neu zu zeichnen. Dieser Ansatz ist skalierbarer.
Implementierung:
Hier ist eine alternative Implementierung, die die oben genannten Probleme angeht:
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); } } }
In dieser alternativen Implementierung :
Das obige ist der detaillierte Inhalt vonWie animiere ich mehrere springende Bälle in Java effizient, ohne sie zu überlappen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!