ホームページ >Java >&#&チュートリアル >複数の跳ねるボールを重なり合わずに表示する Java アプリケーションを作成するにはどうすればよいですか?

複数の跳ねるボールを重なり合わずに表示する Java アプリケーションを作成するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-16 02:35:14258ブラウズ

How can I create a Java application that displays multiple bouncing balls without them overlapping?

Java バウンス ボール

この例では、フレームの端で跳ね返る複数のボールを画面上に描画する Java アプリケーションを作成します。

問題

複数のボールを描画しようとすると、同じボールに追加されるため、互いに上書きされます。

解決策

この問題を解決するには、以下を行う必要があります:

  1. ボールのリストを作成します:ボール オブジェクトを保存する ArrayList。
  2. コンテンツにボールを追加ペイン: ボール オブジェクトをコンテンツ ペインに直接追加する代わりに、リストに追加します。
  3. ボールの描画: リストを反復処理して描画します。各ボールは指定された位置にあります。
  4. ハンドルの動き: 各ボールには、その動きを処理するための独自のスレッドがあり、これらは相互に上書きされません。

これらの変更を実装する変更されたコードは次のとおりです。

import java.awt.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

public class Ball extends JPanel implements Runnable {

    List<Ball> balls = new ArrayList<Ball>();
    Color color;
    int diameter;
    long delay;
    private int x;
    private int y;
    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 = 40;
        x = 1;
        y = 1;
        vx = xvelocity;
        vy = yvelocity;
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        for (Ball ball : balls) {
            ball.paint(g2);
        }
    }

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

    public void move() {
        for (Ball ball : balls) {
            int newX = ball.x + ball.vx;
            int newY = ball.y + ball.vy;

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

    private void start() {
        while (!isVisible()) {
            try {
                Thread.sleep(25);
            } catch (InterruptedException e) {
                System.exit(1);
            }
        }
        Thread thread = new Thread(this);
        thread.setPriority(Thread.NORM_PRIORITY);
        thread.start();
    }

    public static void main(String[] args) {
        Ball ball1 = new Ball("red", 3, 2);
        Ball ball2 = new Ball("blue", 6, 2);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(ball1);
        f.getContentPane().add(ball2);
        ball1.balls.add(ball1);
        ball2.balls.add(ball2);
        f.setSize(400,400);
        f.setLocation(200,200);
        f.setVisible(true);
        ball1.start();
        ball2.start();
    }
}

この更新されたソリューションでは、

  • We個別の Ball オブジェクトを作成し、それらをリストに追加します。
  • paintComponent のリストを反復処理して、すべてのオブジェクトを描画します。ボール。
  • 各ボールには独自の移動スレッドがあり、上書きを防止します。
  • フレームが表示された後にスレッドが確実に開始されるように、start メソッドも実装します。

次の手順に従うことで、画面上に複数の跳ねるボールをうまく描画するプログラムを作成できます。

以上が複数の跳ねるボールを重なり合わずに表示する Java アプリケーションを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。