首頁 >Java >java教程 >如何在 Java 應用程式中顯示多個彈跳球而不互相覆蓋?

如何在 Java 應用程式中顯示多個彈跳球而不互相覆蓋?

Susan Sarandon
Susan Sarandon原創
2024-12-10 02:00:09518瀏覽

How Can I Display Multiple Bouncing Balls in a Java Application Without Overwriting Each Other?

Java 中的彈跳球

問題: 將多個球加入 Java應用程式會產生初始球被第二個覆蓋,導致只有一個可見

解決方案:

要解決此問題並在螢幕上繪製多個彈跳球,請考慮以下方法:

  • 刪除不透明佈局管理器以防止組件重疊並確保正確控制球的大小和位置。
  • 實現您自己的佈局管理器來控制球的大小和位置

2.隨機化球屬性:
  • 隨機化每個球的速度和起始位置,以減少它們碰撞或從同一位置開始的可能性。

3。使用事件調度執行緒 (EDT):

  • 在 EDT 的上下文中更新球,以確保平滑一致的圖形更新。

< ;h4>4。使用球的容器類:

  • 不要將球視為不透明組件,而是創建一個表示每個球的屬性的類,例如其顏色、速度和位置,不渲染任何視覺效果。

5。為球運動建立單獨的線程:

  • 實作此方法可能會佔用大量資源,因此首先探索其他替代方案。

程式碼範例(使用容器類別Balls):

public class Balls extends JPanel {

    private List<Ball> ballsUp;

    // ... (Constructor and other methods)

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (Ball ball : ballsUp) {
            ball.paint(g2d);
        }
        g2d.dispose();
    }

    public List<Ball> getBalls() {
        return ballsUp;
    }
}

public class Ball {

    private Color color;
    private Point location;
    private Dimension size;
    private Point speed;

    // ... (Constructor and other methods)

    protected void paint(Graphics2D g2d) {

        Point p = getLocation();
        if (p != null) {
            g2d.setColor(getColor());
            Dimension size = getSize();
            g2d.fillOval(p.x, p.y, size.width, size.height);
        }

    }
}

public class BounceEngine implements Runnable {

    private Balls parent;

    // ... (Constructor and other methods)

    public void run() {

        // Randomize ball properties and starting positions
        for (Ball ball : getParent().getBalls()) {
            // ... (Randomization logic)
        }

        while (getParent().isVisible()) {

            // Repaint the balls
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    getParent().repaint();
                }
            });

            // Move each ball
            for (Ball ball : getParent().getBalls()) {
                move(ball);
            }

            // Delay between updates
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
            }

        }

    }

    // ... (Remaining code)

}

這種使用容器類別和單獨執行緒進行球運動的方法可以更好地控制球的行為,並允許更複雜的球動畫。

以上是如何在 Java 應用程式中顯示多個彈跳球而不互相覆蓋?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn