一個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)。