1 遊戲動作(Action)的使用
MIDP的Canvas類讓程序員處理某些按鍵事件,要麼作爲特定的低級鍵控代碼事件要麼作爲抽象的遊戲動作。FullCanvas是Nokia的全屏畫布(FullCanvas)類,它是從Canvas類繼承而來的。
在回合制遊戲或者不需要超過四個方向鍵(上、下、左、右)的遊戲中,最好使用直接的鍵盤代碼來控制遊戲動作。可以使用抽象遊戲動作的遊戲例子包括國際象棋和知識測驗以及解謎遊戲,這些都是使用方向鍵來滾動屏幕或者移動。
遊戲動作應該只在不需要快速反應的遊戲中使用。這是因爲所選擇的設備的遊戲動作映射可能對於要求快速動作的遊戲並不適用。並且,如果一個遊戲要求斜的方向鍵或者這個遊戲是一個快節奏的動作遊戲,那時遊戲者一隻手需要移動遊戲角色,另一隻手需要執行其他操作,比如射擊、開門等等,那麼就需要使用直接鍵盤代碼。原因是在MIDP中沒有斜向的遊戲動作,並且遊戲動作映射是爲一隻手使用設計的。
當使用直接鍵盤代碼事件的時候,必須特別注意應用程序的可移植性。
在不同的設備之間鍵盤的佈局有很大區別。開發者可以通過允許用戶在遊戲中自己定義按鍵的方式來解決這個問題。這可以在遊戲開始之前或者在遊戲的"選項"頁面中完成。
鍵盤代碼和遊戲動作在同一個應用程序中決不應該混合使用。
2 關於遊戲動作的說明
一個MIDlet應用程序通過調用Canvas方法來探測哪些鍵盤代碼映射到運行的應用程序中的抽象遊戲動作:
public static int getGameAction(int keyCode); |
Canvas類定義抽象遊戲動作集:UP、DOWN、LEFT、RIGHT、FIRE等等。
遊戲開發者應該知道MIDP 1.0規範中的一個問題。這個類定義了轉化鍵盤代碼到遊戲動作的方法,同樣也定義了轉化遊戲動作到鍵盤代碼的方法。
public int getGameAction(int keyCode) public int getKeyCode(int gameAction) |
方法getKeyCode(int gameAction)可能會導致一些問題,因爲它只能返回基於遊戲動作的一個鍵盤代碼,即使MIDP 1.0允許超過一個鍵盤代碼被實現。在Nokia手機中,個別的一些鍵盤代碼被映射到相同的遊戲動作,比如"UP鍵"和"2鍵"都被映射爲向上的遊戲動作。而這個方法只能返回其中之一;返回的值是特定的實現。然而,如果方法getGameAction(int KeyCode)使用"UP鍵"和"2鍵"的鍵盤代碼作爲參數,這個方法將返回正確的向上的遊戲動作。下面來看一個不好的例子,以加深我們的印象:
//不好的例子,不要這麼做: class TetrisCanvas extends Canvas { int leftKey, rightKey, downKey, rotateKey; void init (){ //FOLLOWING MUST NOT BE DONE leftKey = getKeyCode(LEFT); rightKey = getKeyCode(RIGHT); downKey = getKeyCode(DOWN); rotateKey = getKeyCode(FIRE); } public void keyPressed(int keyCode) { if (keyCode == leftKey) { moveBlockLeft(); } else if (keyCode = rightKey) { ... } } } |
下面是更好的解決方案:
class TetrisCanvas extends Canvas { void init (){ } public void keyPressed(int keyCode) { int action = getGameAction(keyCode); switch (action) { case Canvas.LEFT: moveBlockLeft(); break; case Canvas.RIGHT: moveBlockRight(); break; } } } |
這個例子是MIDP 1.0規範中的例子,使用getKeyCode ( int gameAction)處理鍵盤代碼值,只能返回一個值。如果這樣的話,其它可能的按鍵映射就不能在MIDlet中使用了。比如說,在Nokia 7650中就會出現問題,Nokia 7650有五個方向鍵和一個操縱桿以及普通的鍵盤佈局,上面這個例子就會返回操縱桿的值而不是鍵盤的值。這是處理事件的一種與設備無關的方法,也是一種不好的方法。更好的解決方法是在keyPressed ()方法內使用getGameAction ( int KeyCode)。通常,應用程序應該避免使用getKeyCode ( int gameAction)方法並且總是使用getGameAction ( int KeyCode)。
作者:wayne編譯 轉貼自:yesky.com