Swing组件冻结(Java)

时间:2013-08-05 11:17:49

标签: java swing timer components event-dispatch-thread

我使用Swing组件编写了一个复杂的Snake游戏。 我有一个调用repaint()的计时器(称之为moveRate);每x ms(x在游戏过程中更改,永远不会低于50)。 现在问题是:在整个画面冻结之前我已经成功播放了4分钟左右。

MoveRate类:

class MoveRate extends Timer{
private Date dateCreated=new Date();
private long timeLast=0;

public MoveRate(){
super(190, null);
dateCreated=new Date();
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
  if(getWidth()>0 && getHeight()>0){
    if(points.get(0).x+HOPS>getWidth() || points.get(0).x<0 ||
        points.get(0).y+HOPS>getHeight() || points.get(0).y<0)
      if(!crosswalls && !cheats){
        moveRate.stop();
        prizeRate.stop();
        GameOver();
      }
      else{
        if(points.get(0).y<0)
          points.get(0).y=sp.getHeight()-HOPS;
        else if(points.get(0).y+HOPS>sp.getHeight())
          points.get(0).y=0;
        else if(points.get(0).x<0)
          points.get(0).x=sp.getWidth()-HOPS;
        else
          points.get(0).x=0;
      }
    timeLast=(System.currentTimeMillis()-dateCreated.getTime())/SECONDS;
    score+=timeLast*(200/moveRate.getDelay());                          
  }
  if(prize!=null)
    if(points.get(0).x==prize.x && points.get(0).y==prize.y){
      int newX = points.get(points.size()-1).x-(points.get(points.size()-1).x - points.get(points.size()-2).x);
      int newY = points.get(points.size()-1).y-(points.get(points.size()-1).y - points.get(points.size()-2).y);
      points.add(new Point(newX, newY));
      if(moveRate.getDelay()>50)
        moveRate.setDelay(moveRate.getDelay()-5);
      prize.createPrize(PU_NONE);
      prizeRate.restart();
      score+=timeLast*20*eatmultiplier;
    }
  if(powerup!=null)
    if(points.get(0).x==powerup.x && points.get(0).y==powerup.y){
      int newX = points.get(points.size()-1).x-(points.get(points.size()-1).x - points.get(points.size()-2).x);
      int newY = points.get(points.size()-1).y-(points.get(points.size()-1).y - points.get(points.size()-2).y);
      //points.add(new Point(newX, newY)); //if powerup should increase size
      powerUpPerform(powerup.getType());
      if(moveRate.getDelay()>50)
        moveRate.setDelay(moveRate.getDelay()-5);
      //powerUpRate.restart();
      score+=timeLast*20*eatmultiplier;
      powerup=null;
    }
  p.setScore(score);
  repaint();
}
});
}
}

基本上,MoveRate负责动画以及奖品的“吃饭动作”。加电和检查Game Over情况。 其他一些说明:

我认为这与我尚未学习的线程有关,所以我补充说:

new Thread(new Runnable() {
public void run() {
moveRate=new MoveRate();
moveRate.start();
powerUpRate.start();
prizeRate.start();
}
}).start();

框架仍然冻结。 的System.gc();如果我每隔30秒计时一次也不起作用。

对我来说很容易,因为我是Java的初级学生:&gt;

修改 我试图通过使蛇更长(更长 - 使用我的最终int SNAKE_INITIAL_LENGTH = 200)来重现“bug”。似乎没有对这个问题产生任何影响。

0 个答案:

没有答案