2017-01-11 17 views
1

私は現在、ArrayListBallsを追加していますが、非常に高速に追加されます。ボールに遅れを入れたいですが、2つのスレッドがありますが、まだ同期していません私はかなり新しいですから。遅延を持つ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

クラスボールとは何ですか?名前で判断すると、クラスボールにはクラスボールの複数のインスタンスが含まれていると仮定します。 –

+0

私はクラスボールを追加しました。 – EricTheDevil

答えて

0

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

    } 

timeDiffはbeforeTimeと現在の時刻に依存して、常に周りに2-5されますballCreationスレッドの遅延として、msはそれが起こっているので役に立たないでしょうパラレルスレッド。

したがって、sleepTime = 1000/5-5は常に245ms(約)であり、これは速すぎます。 これにより、現在のスレッド(while(真)内にある)は回転を続け、ボールを245 msの間隔で追加するa.ballCreation内の新しいスレッドを開始します。

ログやSystem.out.println(sleepTime)を試して、満足度に応じて増減してください。

関連する問題