Heim >Java >javaLernprogramm >Wie animiere ich mehrere springende Bälle in Java effizient, ohne sie zu überlappen?

Wie animiere ich mehrere springende Bälle in Java effizient, ohne sie zu überlappen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-09 15:36:12936Durchsuche

How to Efficiently Animate Multiple Bouncing Balls in Java Without Overlapping?

Java Bounce Ball

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:

  • Undurchsichtige Komponenten werden übereinander platziert.
  • Ein Layout-Manager ist nicht spezifiziert, was sich auf die Platzierung der Bälle auswirkt.
  • Die Kontrolle über die Größe und Position des Balls wird nicht effektiv gehandhabt.
  • Geschwindigkeit und Position der Bälle werden nicht zufällig bestimmt.
  • Aktualisierungen des Balls sollten im Rahmen des EDT durchgeführt werden.
  • X/Y-Werte sind nicht erforderlich, wie dies bei den Panels der Fall ist verwendet werden.

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 :

  • Eine einzige Animationsschleife aktualisiert alle Bälle.
  • Die Bälle werden durch einfache Datenstrukturen (keine Komponenten) dargestellt.
  • Die Animationsschleife behandelt die Begrenzung der Ränder des Rahmens.
  • Randomisierung wird zum Variieren verwendet die Startgeschwindigkeit und Position der Bälle.
  • Die update()-Methode berechnet die neue Position jedes Balls.
  • Die draw()-Methode stellt den Ball als gefüllten Kreis dar.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn