2017-05-04 82 views
0

我正在为一个班级创建一个街机游戏。游戏是Columns。我试图让所有的自由浮动块每秒钟下降一次。我的代码使它们失效,但计时器没有。以下是我的代码的相关部分。摆动计时器不工作

前两个出现在我的图块管理员对象,我使用来管理内部逻辑

public void play(){ 
    t = new Timer(1000, this); 
    t.start(); 
    } 
public void actionPerformed(ActionEvent e) { 
    for(int v = 0;v < this.x; v++){ 
     if(v > this.x || v < 0){ 
      break; 
      } 
      for(int b = 0;b < this.y ;b++){ 
       this.gameScreen.get(v).get(b).setActive(true); 
      } 
     } 
     for(int i = 0;i < this.x; i++){ 
      if(i > this.x || i < 0){ 
       break; 
      } 
      for(int j = 0;j < this.y ;j++){ 
       if(this.gameScreen.get(i).get(j).getActive() == true){ 
        if(j + 1 < this.y){ 
         if(this.gameScreen.get(i).get(j+1).toString().equals(".")){ 
    Collections.swap(this.gameScreen.get(i), j, j+1); 
    this.gameScreen.get(i).get(j+1).setActive(false); 
         } 
        } 
       } 
      } 
     } 
    } 

this is the main method that is another file. 

public static void main(String[] args){ 
    ColumnsUI Col = new ColumnsUI(9,9); 
    Col.game.nextBlock(); 
    Col.gw.add(Col.show); 
    Col.game.play(); 
} 

列UI对象是油漆基于内部逻辑的简单方法。我怀疑它与定时器故障有什么关系,因为它在我手动调用actionPerformed的内容时起作用。

感谢您的帮助!

+0

“我的代码,使他们倒下的作品,但计时器没有。”请提供比更多信息“是行不通的。”什么是你期待发生?反而发生了什么? – VGR

+0

我期待actionPerformed中的代码执行。当我将它移到该方法之外并手动执行时,它完全按照它的意图执行,也就是说它将块移开。 –

+0

'Col.game.play();'是否可能执行与您的问题中显示的方法不同的play()方法? – VGR

回答

-1

当发生某些事件时,会调用actionPerfomed。您应该为计时器创建一个单独的类。就像在这段代码中一样,Task类当然必须被你的代码所替代,这会移动砖块。

Timer timer = new Timer(); 

// Start in 1 second and then all 5 seconds forever repatedly 
timer.schedule(new Task(), 1000, 5000); 

请看看在Java API for TimerTask

+0

这是错误的,原因有两个:其一,没有必要为ActionLIstener创建一个单独的类;二,你指的是java.util.Timer,但这个问题是关于javax.swing.Timer的。 – VGR

+0

@VGR如果你已经读过这个问题,你会知道他想要执行actionPerfrmed方法中的代码。我不认为他确实需要这种方法。 TimerTask很好地完成了这项工作。我已经用于我的秋千为基础的游戏已经;) –

+1

你有它倒退。 Swing代码*必须*在AWT事件派发线程中运行。 javax.swing.Timer会自动执行此操作; java.util.Timer没有。 – VGR