>Java >java지도 시간 >여러 개의 튀는 공을 겹치지 않고 표시하는 Java 애플리케이션을 어떻게 만들 수 있습니까?

여러 개의 튀는 공을 겹치지 않고 표시하는 Java 애플리케이션을 어떻게 만들 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-16 02:35:14267검색

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();
    }
}

이 업데이트된 솔루션에서는

  • 우리는 별도의 Ball 개체를 만들어 목록에 추가합니다.
  • paintComponent의 목록을 반복하여 모든 볼 개체를 그립니다. 공.
  • 각 공에는 자체 이동 스레드가 있어 덮어쓰기를 방지합니다.
  • 또한 프레임이 표시된 후 스레드가 시작되도록 시작 메소드를 구현합니다.

이러한 단계를 따르면 화면에 여러 개의 튀는 공을 성공적으로 그리는 프로그램을 만들 수 있습니다.

위 내용은 여러 개의 튀는 공을 겹치지 않고 표시하는 Java 애플리케이션을 어떻게 만들 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.