在實際的游戲中,一般為了按鍵靈敏,我們一般不會直接在keyPressed或keyReleased方法內部書寫邏輯的代碼,而只是在這些方法內部記錄或清除按鍵的記錄,而把實際的處理放在線程中進行。這個是本機制中采用的方式。
而且不同手機的按鍵鍵值存在不同,為了方便移植,我們把按鍵轉換成自己定義的數值,然後在程序中使用自定義的值進行處理。
該機制中最核心的變量為;
private int keyStates;
用該變量中的一個二進制位來代表一種按鍵是否按下,如果按下為1,否則為0。每個按鍵自己進行了定義,定義的代碼如下:
/**向上*/
private final int KEY_UP = 1;
/**向下*/
private final int KEY_DOWN = 1 << 1;
/**向右*/
private final int KEY_RIGHT = 1 << 2;
/**向左*/
private final int KEY_LEFT = 1 << 3;
/**5鍵*/
private final int KEY_FIRE = 1 << 4;
/**左軟鍵*/
private final int KEY_LEFT_SOFT = 1 << 5;
/**右軟鍵*/
private final int UP = 1 << 6;
/**特殊用途按鍵,例如0鍵*/
private final int KEY_ZERO = 1 << 7;
轉換按鍵鍵值的方法根據手機型號不同,也存在很多的不同,下面是WTK模擬器的實現代碼:
/**
* 將物理鍵值轉換為自定義鍵值
* 說明:該方法和機型相關,下面是WTK的實現
* @param keyCode 物理鍵值
* @return 自定義鍵值
*/
private int convertKey(int keyCode) {
switch (keyCode) {
case -6:
return KEY_LEFT_SOFT;
case -7:
return KEY_RIGHT_SOFT;
case Canvas.KEY_NUM2:
case -1:
return KEY_UP;
case Canvas.KEY_NUM4:
case -3:
return KEY_LEFT;
case Canvas.KEY_NUM6:
case -4:
return KEY_RIGHT;
case Canvas.KEY_NUM8:
case -2:
return KEY_DOWN;
case Canvas.KEY_NUM0:
return KEY_ZERO;
}
return 0;
}
按鍵按下時,首先把物理按鍵的鍵值轉換為自定義的鍵值,然後把按鍵信息保存到按鍵狀態變量keyStates中,保存時采用的是位運算符位或實現的。實現代碼如下:
public void keyPressed(int keyCode) {
//轉換按鍵
int key = convertKey(keyCode);
//保存按鍵
keyStates |= key;
}
按鍵釋放時,和按鍵按下類似,首先轉換鍵值,然後清除按鍵信息。清除時把按鍵狀態取反,然後與keyStates位與即可。實現代碼如下:
public void keyReleased(int keyCode) {
//轉換按鍵
int key = convertKey(keyCode);
//清除按鍵
keyStates &= ~key;
}
在界面切換時,需要把按鍵狀態清空,這樣只需要把keyStates清零即可。實現代碼如下:
/**
* 清除按鍵
*/
private void clearKey(){
keyStates = 0;
}
實際的按鍵處理的代碼可以在線程中實現。