我們知道有些手機(jī)是不支持重復(fù)按鍵功能,為了模擬重復(fù)按鍵的功能,我們不得不使用一個(gè)線程來(lái)進(jìn)行處理。對(duì)于重復(fù)按鍵網(wǎng)上已經(jīng)有一些文章進(jìn)行了探討,其實(shí)利用線程我們還可以實(shí)現(xiàn)組合按鍵的功能。當(dāng)然,在手機(jī)這種設(shè)備上,利用組合按鍵進(jìn)行游戲,有一定的限制,因?yàn)槭謾C(jī)各個(gè)按鍵排列比較緊湊,同時(shí)按下兩個(gè)甚至三個(gè)按鍵在操作上會(huì)有局限性。但這也是仁者見(jiàn)仁、智者見(jiàn)智的問(wèn)題,假如你想提高游戲的可玩性和娛樂(lè)性,組合按鍵仍是必不可少的條件。
我定義了一個(gè)進(jìn)行按鍵監(jiān)聽(tīng)的類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)了Runnable接口。在這個(gè)類(lèi)里要害的一個(gè)數(shù)據(jù)結(jié)構(gòu)就是一個(gè)字節(jié)型的數(shù)組,它是用來(lái)存儲(chǔ)當(dāng)前所有被按下的鍵。我這里把數(shù)組的長(zhǎng)度設(shè)定為2,主要是從應(yīng)用的角度來(lái)考慮的,因?yàn)榫烤乖诋?dāng)前手機(jī)設(shè)備上同時(shí)按三個(gè)鍵進(jìn)行游戲的不多。下面就是實(shí)現(xiàn)組合按鍵的核心代碼。
按鍵事件類(lèi):
import javax.microedition.lcdui.*;
public class NewEvent implements Runnable{
KeyEventCanvas c=null;
/*
* 用來(lái)判定是否有鍵被按下
*/
PRotected boolean switchPoint;
/*
* 這個(gè)數(shù)組用來(lái)存儲(chǔ)所有同時(shí)被按鍵的鍵碼
*/
protected byte[] keyCode;
/*
* 訪問(wèn)數(shù)組的索引
*/
byte index;
public NewEvent(KeyEventCanvas c){
this.c=c;
keyCode=new byte[2];
}
/*
* 這個(gè)方法把被按鍵的鍵碼存儲(chǔ)到數(shù)組中
*/
public synchronized void startAction(int keyCode){
this.keyCode[index]=(byte)keyCode;
index=(byte)((index+1)%this.keyCode.length);
}
/*
* 當(dāng)某個(gè)鍵被釋放時(shí),這個(gè)方法把該鍵存儲(chǔ)在數(shù)組中的鍵碼置為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;
}
}
}
/*
* 這個(gè)方法用來(lái)判定是否有被按下的鍵,返回true表示有鍵按下,返回false表示沒(méi)有鍵被按下
*/
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;
}
/*
* 返回字節(jié)數(shù)組
*/
public synchronized byte[] getKeyCode(){
return this.keyCode;
}
public void run(){
byte[] tmp=this.getKeyCode();
while(true){
while(this.getSwitchPoint()){
/*
* 通過(guò)這個(gè)循環(huán)遍歷數(shù)組,碰到被按下的鍵就進(jìn)行處理
*/
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中定義的一個(gè)屬性,表示y軸坐標(biāo)
break;
case Canvas.DOWN:
c.y++;
break;
case Canvas.LEFT:
c.x--;//x是在Canvas中定義的一個(gè)屬性,表示x軸坐標(biāo)
break;
case Canvas.RIGHT:
c.x++;
break;
}
}
}
c.repaint();
try{
Thread.sleep(10);
}catch(InterruptedException e){
}
}
}
}
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注