我們知道有些手機是不支持重復按鍵功能,為了模擬重復按鍵的功能,我們不得不使用一個線程來進行處理。對於重復按鍵網上已經有一些文章進行了探討,其實利用線程我們還可以實現組合按鍵的功能。當然,在手機這種設備上,利用組合按鍵進行游戲,有一定的限制,因為手機各個按鍵排列比較緊湊,同時按下兩個甚至三個按鍵在操作上會有局限性。但這也是仁者見仁、智者見智的問題,假如你想提高游戲的可玩性和娛樂性,組合按鍵仍是必不可少的條件。
我定義了一個進行按鍵監聽的類,這個類實現了Runnable接口。在這個類裡要害的一個數據結構就是一個字節型的數組,它是用來存儲當前所有被按下的鍵。我這裡把數組的長度設定為2,主要是從應用的角度來考慮的,因為究竟在當前手機設備上同時按三個鍵進行游戲的不多。下面就是實現組合按鍵的核心代碼。
按鍵事件類:
import Javax.microedition.lcdui.*;
public class NewEvent implements Runnable{
KeyEventCanvas c=null;
/*
* 用來判定是否有鍵被按下
*/
protected boolean switchPoint;
/*
* 這個數組用來存儲所有同時被按鍵的鍵碼
*/
protected byte[] keyCode;
/*
* 訪問數組的索引
*/
byte index;
public NewEvent(KeyEventCanvas c){
this.c=c;
keyCode=new byte[2];
}
/*
* 這個方法把被按鍵的鍵碼存儲到數組中
*/
public synchronized void startAction(int keyCode){
this.keyCode[index]=(byte)keyCode;
index=(byte)((index+1)%this.keyCode.length);
}
/*
* 當某個鍵被釋放時,這個方法把該鍵存儲在數組中的鍵碼置為0
*/
public synchronized void stopAction(int keyCode){
for(int i=0;i<=this.keyCode.length-1;i++){
if(this.keyCode[i]==(byte)keyCode){
this.keyCode[i]=0;
break;
}
}
}
/*
* 這個方法用來判定是否有被按下的鍵,返回true表示有鍵按下,返回false表示沒有鍵被按下
*/
public synchronized boolean getSwitchPoint(){
this.switchPoint=false;
for(int i=0;i<=this.keyCode.length-1;i++){
if(this.keyCode[i]!=0){
this.switchPoint=true;
break;
}
}
return this.switchPoint;
}
/*
* 返回字節數組
*/
public synchronized byte[] getKeyCode(){
return this.keyCode;
}
public void run(){
byte[] tmp=this.getKeyCode();
while(true){
while(this.getSwitchPoint()){
/*
* 通過這個循環遍歷數組,碰到被按下的鍵就進行處理
*/
for(int i=0;i<=tmp.length-1;i++){
if(tmp[i]!=0){
switch(c.getGameAction(tmp[i])){
case Canvas.UP:
c.y--;//y是在Canvas中定義的一個屬性,表示y軸坐標
break;
case Canvas.DOWN:
c.y++;
break;
case Canvas.LEFT:
c.x--;//x是在Canvas中定義的一個屬性,表示x軸坐標
break;
case Canvas.RIGHT:
c.x++;
break;
}
}
}
c.repaint();
try{
Thread.sleep(10);
}catch(InterruptedException e){}
}
}
}
}
Canvas類:
import javax.microedition.lcdui.*;