Создание шариков, добавляемых в Arraylist с задержкой

Я сейчас добавляю Balls в ArrayList но они добавляются очень быстро, я хотел бы добавить задержку, у меня есть два потока, но они еще не синхронизированы, так как я довольно новый.

Я называю игру, и шары добавляются в Ballholder, Кто-нибудь знает решение для этого?

public class BallsPanel implements Runnable {
    ArrayList<Balls> ballHolder;
    boolean notFull = true;
    int a = 0, d = 0;
    int counter = 0;
    boolean drop = false;
    boolean running;
    Thread ballCreator;

    public BallsPanel() {
        ballHolder = new ArrayList();

    }

    public void ballCreation() {
        ballCreator = new Thread(this);
        ballCreator.start();
    }

    public ArrayList<Balls> getBall() {
        return ballHolder;
    }

    @Override
    public void run() {

        try {
            Thread.sleep(5000);
            ballHolder.add((new Balls()));

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

public class Menu extends JFrame implements Runnable, KeyListener {
    Thread animator;
    volatile boolean running = true;
    int x = 100, y = 100, w = 20, h = 20;
    boolean notFull = true;
    BallsPanel a;
    JLabel ballCounterHolder;
    int ballCounter = 0;

    public Menu() {

        this.setSize(1000, 1000);
        this.addKeyListener(this);
        a = new BallsPanel();
        ballCounterHolder = new JLabel();
        this.add(ballCounterHolder);

        startGame();

        this.setFocusable(true);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public void startGame() {
        if (((animator == null) && (running != false))) {
            animator = new Thread(this);
            animator.start();
            running = true;
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        ArrayList ms = a.getBall();

        for (Object m1 : ms) {
            // if((m[i].wBall) != m[i+1].wBall )
            Balls m = (Balls) m1;
            g.setColor(m.colorBall[m.rndColor]);
            g.fillOval(m.xBall, m.yBall, m.wBall + 1, m.hBall + 1);
            g.drawOval(m.xBall, m.yBall, m.wBall, m.hBall);

        }
    }

    public void ballUpdate() {
        // ballCounterHolder.setText(Integer.toString((ballCounter)));
        ArrayList ms = a.getBall();

        for (int i = 0; i < ms.size(); i++) {

            Balls m = (Balls) ms.get(i);

            // System.out.println(i+" " +i+1);
            if (m.isVisible()) {

                m.drop();
            } else {

                ms.remove(i);

                ballCounter = ballCounter + 1;

            }
        }
    }

    @Override
    public void run() {
        long beforeTime, timeDiff, sleepTime;
        beforeTime = System.currentTimeMillis();

        while (running = true) {

            startGame();

            a.ballCreation();

            repaint();

            ballUpdate();

            timeDiff = System.currentTimeMillis() - beforeTime;
            sleepTime = (1000 / 5) - timeDiff;
            if (sleepTime <= 0) {
                sleepTime = 5;
            }
            try {
                Thread.sleep(sleepTime);

            } catch (InterruptedException ex) {
            }
            // System.out.print(sleepTime+"\n");

            beforeTime = System.currentTimeMillis();
        }
    }

    @SuppressWarnings("deprecation")
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();

        if ((keyCode == KeyEvent.VK_P)) {
            if (running == true) {
                running = false;
                animator.suspend();
            } else {
                running = false;
                animator.resume();
            }
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args) {
        new Menu();
    }
}

public class Balls {
    int xBall, yBall, wBall, hBall;
    int newBall = (int) (Math.random() * 500) + 1;
    int ySpeed = 20;// (int)(Math.random() * 8) + 3;
    int rndColor = (int) (Math.random() * 10) + 0;
    boolean visi;
    Color[] colorBall;

    public Balls() {
        xBall = 40 + newBall;
        yBall = 0;
        wBall = 20;
        hBall = 20;
        visi = true;

        colorBall = new Color[10];

        colorBall[0] = Color.red;
        colorBall[1] = Color.blue;
        colorBall[2] = Color.yellow;
        colorBall[3] = Color.pink;
        colorBall[4] = Color.orange;
        colorBall[5] = Color.green;
        colorBall[6] = Color.black;
        colorBall[7] = Color.magenta;
        colorBall[8] = Color.cyan;
        colorBall[9] = Color.gray;
    }

    public boolean isVisible() {
        return visi;
    }

    public void drop() {
        if (yBall < 500) {
            yBall = yBall + ySpeed;
            visi = true;

        } else {
            visi = false;
        }
    }

    public int getWidth() {
        return wBall;
    }

    public int getHeight() {
        return hBall;
    }

}

1 ответ

Если вы посмотрите на код ниже:

timeDiff = System.currentTimeMillis() - beforeTime;
     sleepTime = (1000/5)- timeDiff;
     if(sleepTime <= 0){sleepTime = 5;}
     try{
         Thread.sleep(sleepTime);

     }

timeDiff зависит от beforeTime и текущего времени, которое всегда будет около 2-5 мс, поскольку задержка в потоке ballCreation будет бесполезной, поскольку она происходит в параллельном потоке.

Таким образом, sleepTime = 1000/5 - 5 всегда составляет 245 мс (приблизительно), что слишком быстро. Из-за этого текущий поток (который находится внутри while(true)) продолжает вращаться и запускать новые потоки внутри a.ballCreation, которые добавляют шары в интервале 245 мс.

Попробуйте войти в систему или System.out.println(sleepTime) и увеличить / изменить его в соответствии с вашим удовлетворением.

Другие вопросы по тегам