문제:
화면에 여러 개의 공을 그릴 때 프레임 가장자리에서 튀어오르는 경우 , 두 번째 공이 초기 공을 덮어씁니다.
코드:
제공된 코드는 여러 개의 튀는 공을 그리려고 시도하지만 두 번째 공이 초기 공을 덮어씁니다.
현재 접근 방식에는 다음과 같은 문제가 있습니다.
다중 스레드의 확장성 문제:
현재 접근 방식에서는 각 공에 대해 별도의 스레드를 생성하는 것이 포함됩니다. 이는 특히 공의 수가 증가할 때 시스템 리소스에 부담을 줄 수 있습니다.
대체 접근 방식:
각 공에 대한 구성 요소를 사용하는 대신 공에 대한 컨테이너를 만드는 것이 좋습니다. 간단한 애니메이션 루프를 사용하여 위치를 업데이트하고 다시 그립니다. 이 접근 방식은 확장성이 더 뛰어납니다.
구현:
위에 언급된 문제를 해결하는 대체 구현은 다음과 같습니다.
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); } } }
이 대체 구현에서는 :
위 내용은 Java에서 겹치지 않고 여러 개의 튀는 공을 효율적으로 애니메이션화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!