>Java >java지도 시간 >Java에서 겹치지 않고 여러 개의 튀는 공을 효율적으로 애니메이션화하는 방법은 무엇입니까?

Java에서 겹치지 않고 여러 개의 튀는 공을 효율적으로 애니메이션화하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-09 15:36:12929검색

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

Java 바운싱 볼

문제:

화면에 여러 개의 공을 그릴 때 프레임 가장자리에서 튀어오르는 경우 , 두 번째 공이 초기 공을 덮어씁니다.

코드:

제공된 코드는 여러 개의 튀는 공을 그리려고 시도하지만 두 번째 공이 초기 공을 덮어씁니다.

현재 접근 방식에는 다음과 같은 문제가 있습니다.

  • 불투명한 구성 요소가 각 위에 배치됩니다. 기타.
  • 레이아웃 관리자가 지정되지 않아 공의 배치에 영향을 줍니다.
  • 공의 크기와 위치 제어가 효율적으로 처리되지 않습니다.
  • 속도 공의 위치는 무작위로 지정되지 않습니다.
  • 공 업데이트는 다음과 같은 맥락에서 수행되어야 합니다. EDT.
  • 패널을 사용할 수 있으므로 X/Y 값은 필요하지 않습니다.

다중 스레드의 확장성 문제:

현재 접근 방식에서는 각 공에 대해 별도의 스레드를 생성하는 것이 포함됩니다. 이는 특히 공의 수가 증가할 때 시스템 리소스에 부담을 줄 수 있습니다.

대체 접근 방식:

각 공에 대한 구성 요소를 사용하는 대신 공에 대한 컨테이너를 만드는 것이 좋습니다. 간단한 애니메이션 루프를 사용하여 위치를 업데이트하고 다시 그립니다. 이 접근 방식은 확장성이 더 뛰어납니다.

구현:

위에 언급된 문제를 해결하는 대체 구현은 다음과 같습니다.

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

    }

}

이 대체 구현에서는 :

  • 단일 애니메이션 루프가 모든 항목을 업데이트합니다. 공.
  • 공은 구성요소가 아닌 단순한 데이터 구조로 표현됩니다.
  • 애니메이션 루프는 프레임 가장자리 경계를 처리합니다.
  • 무작위화를 사용하여 변경합니다. 공의 시작 속도와 위치.
  • update() 메소드는 각 공의 새로운 위치를 계산합니다. ball.
  • draw() 메소드는 공을 채워진 원으로 렌더링합니다.

위 내용은 Java에서 겹치지 않고 여러 개의 튀는 공을 효율적으로 애니메이션화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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