>  기사  >  Java  >  제공된 코드는 모양이 임의의 지연으로 화면에 나타나도록 어떻게 보장하고 모든 모양이 동시에 나타나는 것을 방지합니까?

제공된 코드는 모양이 임의의 지연으로 화면에 나타나도록 어떻게 보장하고 모든 모양이 동시에 나타나는 것을 방지합니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-03 13:02:30867검색

How does the provided code ensure that shapes appear on the screen with random delays, preventing them from all appearing simultaneously?

움직이는 개체 및 타이머

이 작업의 목표는 특정 움직임 패턴을 따르는 무작위로 나타나는 모양이 있는 화면을 만드는 것입니다. 오르막에 도달했다가 다시 아래로 떨어집니다.

문제

초기 구현에서는 동일한 타이머를 사용하기 때문에 모든 도형이 동시에 나타나는 문제가 발생했습니다. 목표는 각 모양이 무작위 지연으로 나타나도록 하는 것입니다.

무작위 지연을 사용한 솔루션

업데이트된 코드에서:

  • A Random Delay for 각 모양: 각 모양은 생성 시 무작위 지연이 할당됩니다.
  • 타이머 작업은 모든 모양을 수신합니다. 타이머의 사용자 정의 작업 리스너는 모든 모양을 모니터링합니다.
  • Shape 클래스의 이동 논리: Shape 클래스에는 이동 논리(상승 또는 감소 상승)가 포함되어 있습니다.
  • 지연 처리: 타이머 작업 리스너는 Shape 메서드를 호출합니다. 지연을 줄이기 위해 지연이 0에 도달하면 모양이 보이고 움직이기 시작합니다.
  • 색상 변화: 시각적 매력을 위해 모양에 다양한 색상을 부여했습니다.

개선된 코드

동시 출현 문제를 해결하는 개선된 코드는 다음과 같습니다.

<code class="java">import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class RandomShape extends JPanel {

    private static final int D_HEIGHT = 500;
    private static final int D_WIDTH = 400;
    private static final int INCREMENT = 8;
    private List<Shape> shapes;
    private List<Color> colors;
    private Timer timer = null;

    public RandomShape() {
        colors = createColorList();
        shapes = createShapeList();

        timer = new Timer(30, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (Shape shape : shapes) {
                    shape.move();
                    shape.decreaseDelay();
                    repaint();
                }
            }
        });
        JButton start = new JButton("Start");
        start.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                timer.start();
            }
        });
        JButton reset = new JButton("Reset");
        reset.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                shapes = createShapeList();
                timer.restart();
            }
        });

        JPanel panel = new JPanel();
        panel.add(start);
        panel.add(reset);
        setLayout(new BorderLayout());
        add(panel, BorderLayout.PAGE_START);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Shape shape : shapes) {
            shape.drawShape(g);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(D_WIDTH, D_HEIGHT);
    }

    private List<Color> createColorList() {
        List<Color> list = new ArrayList<>();
        list.add(Color.BLUE);
        list.add(Color.GREEN);
        list.add(Color.ORANGE);
        list.add(Color.MAGENTA);
        list.add(Color.CYAN);
        list.add(Color.PINK);
        return list;
    }

    private List<Shape> createShapeList() {
        List<Shape> list = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 20; i++) {
            int randXLoc = random.nextInt(D_WIDTH);
            int randomDelayedStart = random.nextInt(100);
            int colorIndex = random.nextInt(colors.size());
            Color color = colors.get(colorIndex);
            list.add(new Shape(randXLoc, randomDelayedStart, color));
        }

        return list;
    }

    class Shape {

        int randXLoc;
        int y = D_HEIGHT;
        int randomDelayedStart;
        boolean draw = false;
        boolean down = false;
        Color color;

        public Shape(int randXLoc, int randomDelayedStart, Color color) {
            this.randXLoc = randXLoc;
            this.randomDelayedStart = randomDelayedStart;
            this.color = color;
        }

        public void drawShape(Graphics g) {
            if (draw) {
                g.setColor(color);
                g.fillOval(randXLoc, y, 30, 30);
            }
        }

        public void move() {
            if (draw) {
                if (y <= 50) {
                    down = true;
                }

                if (down) {
                    y += INCREMENT;
                } else {
                    y -= INCREMENT;
                }
            }
        }

        public void decreaseDelay() {
            if (randomDelayedStart <= 0) {
                draw = true;
            } else {
                randomDelayedStart -= 1;
            }
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new RandomShape());
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}</code>

이 향상된 코드는 각 모양에 무작위 지연을 할당하고 타이머가 관리하도록 하여 문제를 해결합니다. 모든 모양. 각 모양의 움직임은 내부적으로 처리되며 타이머는 모양이 보이고 움직이기 시작할 때까지 지연 시간을 줄입니다.

위 내용은 제공된 코드는 모양이 임의의 지연으로 화면에 나타나도록 어떻게 보장하고 모든 모양이 동시에 나타나는 것을 방지합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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