2013-03-20 64 views
6

我正在學習基於文本的遊戲,因爲我正在學習Java。我希望能夠在遊戲中統計輪次,作爲管理某些事件進度的手段。例如,更換室可以每輪限定爲一次(在測試代碼中爲一秒)。小型生物可能會以更高的速度攻擊或更換房間,而較大的生物可能更麻煩。目前很好?大。在基於文本的遊戲中處理時間(Java)

所以,我熟悉了這一點,並立即意識到,每當while循環等待播放器輸入命令時,我都會觸碰一個塊。代碼:

private void startPlaying() { 
    //declare clock/round variables. 
    int lastRound = 0; 
    int currentRound = 0; 
    long lastTime = System.currentTimeMillis(); 
    long currentTime; 

    while (player.getIsPlaying()){ 
     //Clocking 
     currentTime = System.currentTimeMillis(); 
     if ((lastTime + 1000) < currentTime) { 
      lastTime = currentTime; 
      lastRound = currentRound; 
      currentRound++; 
      System.out.println("Current round:\t" + currentRound + "\tCurrent time:\t" + currentTime); //EDIT:NOTE: This is just a test line to observe the loop. 
     }//end if (Clocking) 

     Command command = new Command(); 
     String[] commandString = command.setAll(); //Array gets parsed elsewhere. 
     player.doCommand(commandString); 
     //Class Player extends Pawn extends Actor; Pawn has most command methods. 
    } 
    finishPlaying(); 
}//END STARTPLAYING() 

所以,這裏是我的問題:

有沒有一種方法,我可以用一個單獨的方法來記錄時間/輪併發往while循環使用命令提示符呈現的球員?

如果沒有,是否有另一種方法可以使這個問題不存在,我只是沒有看到/練習過呢?

回答

4

看看Concurrency tutorial。使用線程,您可以在不停止其他進程的情況下等待用戶輸入(並使這些其他進程同時執行 - 不是並行執行,而是分時執行)。

+0

我想Oracle的教程將是一個更明智的開始。一旦我擁有聲望,就會進行投票。 – eenblam 2013-03-20 18:57:13

1

它被稱爲「遊戲循環」,無論用戶輸入如何,遊戲都能平穩運行。

最直接的解決方案 - 創建2個線程,首先等待用戶輸入並將其放入容量爲1的ConcurrentLinkedQueue。第二個線程將運行您的遊戲循環,並從隊列中接受用戶輸入以在隊列不爲空。

您可以使用任何想要在2個線程之間交換數據的數據結構,它甚至可以是易變的字符串變量。讀取寫入該變量的唯一要求應該以某種方式進行同步。

+0

太棒了,感謝您的簡要解釋。我可能需要在文檔中花費一點時間,但這聽起來很可行。 – eenblam 2013-03-20 18:58:42

1

實時文字冒險?聽起來不錯。我不會建議嘗試爲這個特定的問題做併發,有更簡單的方法。

通常情況下,您不會在時間上以秒爲單位混合輸入阻塞。除非你對這個設計有所瞭解,否則我也會建議。

1)不要阻止用戶輸入。通過檢查每個幀的按鍵編寫自己的輸入處理代碼。然後你可以計算迭代之間的時間差。例如。一個怪物移動1個塊秒,所以如果當前循環迭代花費100ms,那麼它移動0.1個塊。 (即使您在文字網格上繪製,也會在內部存儲這些值爲float s

2)根據用戶輸入增加「滴答」中的遊戲時間。這將是NetHack/Roguelike風格。怪物可以移動很多塊,而不是每秒。

+0

關於tick方法的想法,但我看不到轉移到多人遊戲實現,這將是一個很好的未來項目。我也讚賞備選方案1中的備選方法,因爲這本身就是一個啓發性項目。我可能會使用線程來學習它們(最初的目標),然後在該線程中實現這個輸入處理。 – eenblam 2013-03-20 19:03:06

1

是的,有一種方法。您需要將「Round Counting」代碼放置在其自己的Thread中,以免用戶等待輸入數據。 java.util.concurrency包可以幫助解決這個問題。

看看Java Doc scheduleAtFixedRate()方法將以固定的時間間隔執行一個可運行的程序。 「循環計數」代碼將被移至實現runnable接口的類。這將在設定的時間間隔內執行。雖然這是相當先進的。