2009-02-26 60 views
6

編輯:這讓我對現在更加理解,因爲我已經離開了代碼一步,感謝您的幫助。j2me「回合制」遊戲的Gameloop

剛剛發現堆棧溢出有一天通過編碼恐怖,它看起來很棒。我會問社區關於我目前正在努力解決的一個問題。

我正在開發一款使用j2me for midp 2.0手機的roguelike sortof遊戲。當我弄清楚它將如何工作時,該項目仍處於發展的基本階段。我目前堅持的部分與線程有關。

遊戲有一個定製的HaxCanvas類,它擴展了GameCanvas和Implements runnable。它的運行方法調用repaint(),然後睡眠50 ms,結果幀率爲20 FPS。這使我可以編寫遊戲的其餘部分,而無需在任何地方進行重繪,並且稍後應該使動畫和效果更容易完成。 (至少在理論上)。

遊戲的流程由一個GameManager類控制,該類可以循環遍歷地圖上的所有NPC,輪到他們,直到輪到玩家。在這一點上,我需要獲得投入,讓玩家移動和/或攻擊事物。我原本在HaxCanvaskeyPressed方法中調用gameManager.runUntilHeroTurn()。然而,在讀完j2me系統線程後,我意識到將一個方法放在回調中運行一段時間是一個不好的主意。但是我必須使用keyPressed來完成輸入操作,因爲我需要訪問數字鍵,並且getKeyStates()不支持此操作。

我試圖把我的gameloop放在它自己的線程中,結果導致了災難。一個奇怪的「未捕獲的ArrayIndexOutOfBoundsException」沒有堆棧跟蹤顯示出來後,遊戲已經跑了好幾個回合。

,所以我想我的問題是這樣的:

對於「回合制」遊戲在J2ME中,什麼是執行遊戲循環的最好辦法,允許輸入僅HANDELING當它是玩家的大轉彎?

+0

順便說一句,好問題。 +1 – Fostah 2009-02-26 14:49:18

回答

3

我會避免使用J2ME線程進行遊戲邏輯的線程化,這取決於製造商當然不會很好地共享有限的資源。當線程執行大量處理時,您經常會看到暫停。我只會推薦加載或網絡連接功能的線程,因爲在這種情況下,您只需向用戶提供基本的「加載...」反饋。

爲了解決這個問題,我不會有子循環來更新一個幀中的每個AI。我會做類似的運行功能如下:

public void run() { 
    while(true) { 
     // Update the Game 
     if(gameManager.isUsersTurn()) { 
      // Collect User Input 
      // Process User Input 
      // Update User's State 
     } 
     else { 
      // Update the active NPC based on their current state 
      gameManager.updateCurrentNPC(); 
     } 

     // Do your drawing 
    } 
} 

你想避免一切在一幀更新1)更新可能很慢,從而爲用戶2沒有直接的視覺反饋),你可以每個NPC在做出行動時都不會動畫。有了這個設置,你可以擁有NPC狀態NPC_DECIDE_MOVE和NPC_ANIMATING,這將允許你進一步控制NPC的行爲。 NPC_ANIMATING基本上會讓遊戲處於動畫發生的等待狀態,避免進一步處理,直到動畫完成。然後它可以轉向下一個NPC。另外,我只需要一個gameManager.update()和gameManager.paint(g)(paint將從paint調用)來處理所有事情,並保持run方法的精簡。

最後,你看看flushGraphics()嗎?通過GameCanvas,你通常會創建一個Graphics對象,繪製一切,然後調用flushGraphics(),然後等待。你提到的方法是解決Canvas類的方法。只是想我會提到這個併發佈一個鏈接: Game Canvas Basics

5

儘管不是j2me,你應該捕獲用戶輸入,一般策略是將輸入排隊,直到它處理輸入爲止。

input ---> queue <---> Manager(loop) 

這樣你甚至可以腳本輸入用於調試目的。

所以你不需要一個新的線程。每次用戶按下按鍵時,都會將它們存儲在緩衝區中,並在必要時處理緩衝區的內容。如果玩家緩衝區沒有輸入,經理應該跳過所有的遊戲,做動畫,然後重新開始(因爲遊戲不是動作遊戲)。