2015-11-21 44 views
0

因此,當我的遊戲級別創建時,枚舉遊戲狀態爲STATE.intro,並且在此狀態下,指示遊戲在將狀態更改爲STATE.playing之前進行3秒倒計時,之後您可以實際上開始播放,屏幕開始移動。這是爲了讓玩家在按下「播放」按鈕和實際播放之間準備好3秒鐘。不幸的是,它只註冊了前兩個級別。不管我開始自己的水平如何,第三級在開始時不會有這種延遲,我不知道爲什麼。畫一個更好的畫面,這裏的一些代碼從我的渲染方法:如何使用計時器來創建'準備就緒!'延遲在我的比賽開始?

if(gameState == STATE.intro) {    //at the start of the level, wait 3 seconds for the player to get ready 
       getReadyText.draw(batch, "GET READY!", centerX - (Gdx.graphics.getWidth()/10), screenCeiling-(Gdx.graphics.getHeight()/2)); 
       introDelay(); 
      } 

public void introDelay() { 
    //creates a delay from when the level loads, and you start playing 

    if(intro) { 
     intro = false; 

     Timer.schedule(new Task() { 

      @Override 
      public void run() { 
       gameState = STATE.playing; 
      } 
     }, 3);  //3 seconds 
    } 

} 

介紹是一個單獨的布爾設置爲true創建水平時。我使用它來確保定時器只創建一次,而不是每一幀遊戲狀態都處於「前奏」模式。另請注意,introDelay()不在渲染內。有任何想法嗎?

+0

也許你沒有重置國家?順便說一下,我會建議[這](http://stackoverflow.com/questions/32667282/how-to-render-a-sprite-2-seconds-after-a-collision/32667554#32667554)方法,而不是定時器避免任何線程競爭條件的延遲。 – Kush

+0

但我想在延遲期間繪製地圖,以便玩家知道最初會期待什麼 – Darren

回答

0

你確定你的代碼第三次進入if(intro){...}語句嗎?另外我同意Kush,並且我會建議使用一個計數器,它在每個幀中以deltaTime上升,而不是Timer.schedule函數。它會是這樣的

public void render(float deltaTime) { 
    stateTime += deltaTime; 
    ... 
    switch(gameState) 
    { 
      case State.STATE_INTRO: 
       getReadyText.draw(batch, "GET READY!", centerX - (Gdx.graphics.getWidth()/10), screenCeiling-(Gdx.graphics.getHeight()/2)); 
       if(stateTime > 3) { 
        setState(State.STATE_PLAY); 
       } 
       break; 
      case State.STATE_PLAY: 
       //your code for playing state; 
       break; 
    } 
} 

public void setState(State state) { 
    stateTime = 0; 
    gameState = state; 
} 
相關問題