2017-01-11 1 views
1

В настоящее время я добавляю Balls в ArrayList, но они добавляются очень быстро, я хотел бы поставить задержку на мяч, у меня есть два потока, но они еще не синхронизированы так как я довольно новый.Создание шариков, добавленных в 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; 
    } 

} 
+0

Что такое классные шары? Судя по имени, я предполагаю, что класс Balls содержит несколько экземпляров класса Ball. –

+0

Я добавил классные шары. – EricTheDevil

ответ

0

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

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

    } 

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

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

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

Смежные вопросы