2017-05-04 45 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