Heim > Java > javaLernprogramm > Wie verhindert man überlappende springende Bälle in einer Java-Anwendung?

Wie verhindert man überlappende springende Bälle in einer Java-Anwendung?

Mary-Kate Olsen
Freigeben: 2025-01-03 06:51:38
Original
610 Leute haben es durchsucht

How to Prevent Overlapping Bouncing Balls in a Java Application?

Java Bounce Ball

Dieses Problem betrifft eine Java-Anwendung, die darauf ausgelegt ist, mehrere Bälle auf einer Schnittstelle darzustellen, die von den Rändern abprallen. Der Benutzer hat das Zeichnen eines einzelnen Balls erfolgreich implementiert, stößt jedoch beim Versuch, einen zweiten Ball hinzuzufügen, auf Probleme, da dieser den ersten Ball überschreibt.

Um dieses Problem zu beheben, kann eine Liste von Bällen erstellt und durchlaufen werden um jeden Ball zu zeichnen, aber der Benutzer hat Schwierigkeiten, beide Bälle zum Inhaltsbereich hinzuzufügen.

Analyse und Lösung

Das Hauptproblem ist die Platzierung von zwei undurchsichtige Komponenten übereinander liegen, was möglicherweise dazu führt, dass die eine die andere verdeckt. Um dieses Problem zu beheben:

  1. Es sollte ein Null-Layout-Manager eingesetzt werden, um zu verhindern, dass der Layout-Manager das Layout der Bälle vorgibt.
  2. Größe und Position des Ballbereichs sollten kontrolliert werden , wodurch er effektiv die Rolle des Layout-Managers übernimmt.
  3. Die Geschwindigkeit und Position der Bälle sollte zufällig sein, um die Wahrscheinlichkeit identischer Startpunkte zu verringern Bewegung.
  4. Nur ​​der Ball sollte im Kontext des EDT (Event Dispatch Thread) aktualisiert werden.
  5. Die Verwendung von X/Y-Werten ist überflüssig und kann durch die Nutzung der Panels selbst eliminiert werden .

Codebeispiel

Ein verbessertes Codebeispiel, das diese enthält Modifikationen:

public class Balls {

    public Balls() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TheBalls());
                frame.setSize(400, 400);
                frame.setVisible(true);
            }
        });
    }

    public class TheBalls extends JPanel {

        public TheBalls() {
            setLayout(null);
            // Randomize the speed and direction...
            add(new Ball("red", 10 - (int) Math.round((Math.random() * 20)), 10 - (int) Math.round((Math.random() * 20))));
            add(new Ball("blue", 10 - (int) Math.round((Math.random() * 20)), 10 - (int) Math.round((Math.random() * 20))));
        }
    }

    public class Ball extends JPanel implements Runnable {

        Color color;
        int diameter;
        long delay;
        private int vx;
        private int vy;

        public Ball(String ballcolor, int xvelocity, int yvelocity) {
            if (ballcolor == "red") {
                color = Color.red;
            } else if (ballcolor == "blue") {
                color = Color.blue;
            } else if (ballcolor == "black") {
                color = Color.black;
            } else if (ballcolor == "cyan") {
                color = Color.cyan;
            } else if (ballcolor == "darkGray") {
                color = Color.darkGray;
            } else if (ballcolor == "gray") {
                color = Color.gray;
            } else if (ballcolor == "green") {
                color = Color.green;
            } else if (ballcolor == "yellow") {
                color = Color.yellow;
            } else if (ballcolor == "lightGray") {
                color = Color.lightGray;
            } else if (ballcolor == "magenta") {
                color = Color.magenta;
            } else if (ballcolor == "orange") {
                color = Color.orange;
            } else if (ballcolor == "pink") {
                color = Color.pink;
            } else if (ballcolor == "white") {
                color = Color.white;
            }
            diameter = 30;
            delay = 100;

            vx = xvelocity;
            vy = yvelocity;

            new Thread(this).start();

        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;

            int x = getX();
            int y = getY();

            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(color);
            g.fillOval(0, 0, 30, 30); //adds color to circle
            g.setColor(Color.black);
            g2.drawOval(0, 0, 30, 30); //draws circle
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(30, 30);
        }

        public void run() {

            try {
                // Randamize the location...
                SwingUtilities.invokeAndWait(new Runnable() {
                    @Override
                    public void run() {
                        int x = (int) (Math.round(Math.random() * getParent().getWidth()));
                        int y = (int) (Math.round(Math.random() * getParent().getHeight()));

                        setLocation(x, y);
                    }
                });
            } catch (InterruptedException exp) {
                exp.printStackTrace();
            } catch (InvocationTargetException exp) {
                exp.printStackTrace();
            }

            while (isVisible()) {
                try {
                    Thread.sleep(delay);
                } catch (InterruptedException e) {
                    System.out.println("interrupted");
                }

                try {
                    SwingUtilities.invokeAndWait(new Runnable() {
                        @Override
                        public void run() {
                            move();
                            repaint();
                        }
                    });
                } catch (InterruptedException exp) {
                    exp.printStackTrace();
                } catch (InvocationTargetException exp) {
                    exp.printStackTrace();
                }
            }
        }

        public void move() {

            int x = getX();
            int y = getY();

            if (x + vx < 0 || x + diameter + vx > getParent().getWidth()) {
                vx *= -1;
            }
            if (y + vy < 0 || y + diameter + vy > getParent().getHeight()) {
                vy *= -1;
            }
            x += vx;
            y += vy;

            // Update the size and location...
            setSize(getPreferredSize());
            setLocation(x, y);

        }
    }
}
Nach dem Login kopieren

Alternativer Ansatz

Alternativ könnte ein Container zur Unterbringung der Bälle erstellt werden, in dem die Bälle selbst keine Komponenten sind, sondern als virtuelle Konzepte mit ausreichenden Informationen existieren, um das Abprallen zu ermöglichen Oberflächen.

Skalierbarkeitsbedenken

Es ist wichtig zu beachten, dass das bereitgestellte Code-Snippet ein separates verwendet Thread für jeden Ball, was sich auf die Systemressourcen auswirken kann, wenn die Anzahl der Bälle zunimmt. Um dieses Skalierbarkeitsproblem zu lösen, kann ein einzelner BounceEngine-Thread verwendet werden, um alle Ballbewegungen zu verarbeiten.

Das obige ist der detaillierte Inhalt vonWie verhindert man überlappende springende Bälle in einer Java-Anwendung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage