在J2ME的低級用戶界面編程中,進行事件處理是經常應用到的技巧之一,由於處理手機鍵盤上的按鍵事件是最常應用到的一種,所以就以此為中心,先容一下實際應用過程中三種處理方法進行闡明:
1、 籠罩keyPressed方法
在持續了Canvas的界面中,假如需要進行按鍵的處理,我們只需要在該類中籠罩Canvas類裡面的這個方法,當手機按鍵被按下時,系統會主動調用該方法,並把被按下的按鍵的鍵值(keyCode)作為參數傳遞進來。所以假如需要處理按鍵事件,只需要在該方法內部檢測按下的按鍵的鍵值就可以了。
在手機鍵盤上,可以簡略的分為功效鍵區域和數字鍵區域,功效鍵指手機上的左右軟鍵,中間的導航鍵以及接聽電話和掛機鍵等,數字鍵區域指手機鍵盤上的0-9數字鍵以及*號和#號鍵。其中功效鍵的個數以及鍵值,不同的手機差別很大,而數字鍵的區域的按鍵個數,以及按鍵的鍵值都是一樣的。
檢測鍵值有如下兩種方法:
a) 直接應用keyCode值
直接應用keyCode值的代碼有如下兩種,分辨是:
if(keyCode == 52){
//處理代碼
}
或者:
if(keyCode == Canvas.KEY_NUM4){
//處理代碼
}
以上是應用按鍵處理中的兩種代碼書寫作風,建議實際應用過程中應用第二種,這樣代碼輕易浏覽。 而在實際的游戲開發過程,除了一些特別的功效鍵,例如手機上的左右軟鍵,很少應用這種方法進行編寫,而是采用下面的方法進行處理。
b) 應用gameAction(游戲動作)
gameAction是一種將手機鍵盤映射成為游戲動作的機制,通過這種機制,可以使不同手機上的按鍵都能轉換為類似或者是雷同的游戲動作,當然這個工作是由每個手機廠商實現的。
實際應用中的代碼如下:
//將keyCode轉換為游戲動作
int action = getGameAction(keyCode);
其中,keyCode和游戲動作的對應關系如下:
Canvas.UP——數字鍵2和向上導航鍵
Canvas.DOWN——數字鍵8和向下導航鍵
Canvas.LEFT——數字鍵4和向左導航鍵
Canvas.RIGHT——數字鍵6和向右導航鍵
Canvas.FIRE——數字鍵5和斷定導航鍵
Game_A、Game_B、Game_C、Game_D分辨對應鍵盤上的1、3、7、9或者是7、9、*、#鍵。
轉換成游戲動作以後的事件處理代碼如下:
switch(action){
case Canvas.LEFT://向左
//處理代碼
break;
case Canvas RIGHT://向右
break;
case Canvas.UP://向上
break;
……
}
這個就是MIDP1.0中最常應用的按鍵處理方法。但是無論這種方法如何的優勝,它還是無法擺脫keyPressed方法的束縛。
這樣就將游戲編程中的三種邏輯:延遲、響利用戶把持、重新繪制,隔離了開來,分辨在用戶線程和系統線程中進行。
為懂得決這個不足,MIDP2.0在GameCanvas內部引進了一種新的事件處理方法按鍵狀態(keyStates)機制。
2、 應用keyStates
按鍵狀態指系統通過一個變量來記錄手機鍵盤上每個和游戲動作有關的按鍵,假如該鍵按下則設置對應的位(bit)為1,否則為0,然後可以通過位運算獲得哪個按鍵被按下。
留心:按鍵狀態只能在MIDP2.0的GameCanvas子類中裡面應用,而且只能處理和游戲相干的按鍵。假如支撐該處理方法處理游戲按鍵的話,將在keyPressed方法中無法接收到和游戲相干的按鍵,其他按鍵還可以正常接收響應。
假如要應用該功效,首先要在GameCanvas子類的結構方法中,讓該界面支撐該把持,這個步驟可以應用GameCanvas的結構方法來實現,代碼如下:
//使該界面支撐按鍵狀態處理
super(true);
這樣該界面就可以進行按鍵狀態處理。和前面的按鍵處理不同,該種處理方法可以脫離keyPressed方法的限制,也就是說可以寫在任意的處理方法內部,只需要在線程中調用即可。
應用該處理方法,無論線程中的延遲多麼長,系統都可以保持該按鍵的狀態。這個利益是其他處理方法無法做到的。
首先,獲得游戲按鍵狀態,代碼如下:
//獲得游戲的按鍵狀態
int states = getKeyStates();
該代碼的作用是獲得當前按鍵狀態,並把按鍵狀態清空!具體的處理代碼如下:
//處理按鍵狀態:
if((states & GameCanvas.LEFT_PRESSED) != 0){ //向左
}
if((states & GameCanvas. RIGHT_PRESSED) != 0){ //向右
}
在MIDP2.0的Game API處理中,這個方法使手機游戲開發重新回回到傳統的模式中,也使游戲的處理更加機動