本文主要講述在MIDP1.0情況下處理開發(fā)過(guò)程遇到的連續(xù)按鍵事件,結(jié)合具體的實(shí)例給出一種實(shí)用的解決方案。 我們知道MIDP中的低級(jí)事件處理是通過(guò)keyPressed()、keyReleased()和keyRepeated()來(lái)處理的,分別在按鍵被按下、釋放和重復(fù)按鍵的時(shí)候被觸發(fā)。當(dāng)方法被調(diào)用的時(shí)候,系統(tǒng)會(huì)把所按下鍵的鍵值傳遞給上述的三個(gè)方法,根據(jù)按鍵的鍵值我們可以進(jìn)行相關(guān)的處理。在MIDP中定義了如下的按鍵值分別是: KEY_NUM0, KEY_NUM1, KEY_NUM2, KEY_NUM3, KEY_NUM4, KEY_NUM5, KEY_NUM6, KEY_NUM7, KEY_NUM8, KEY_NUM9, KEY_STAR 和 KEY_POUND。 在游戲開發(fā)中為了保證程序的可移植性,通常我們都會(huì)把鍵值轉(zhuǎn)換為游戲動(dòng)作,在MIDP中定義了如下的游戲動(dòng)作: UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C,GAME_D。轉(zhuǎn)換非常簡(jiǎn)單,可以通過(guò)Canvas提供的方法getGameAction()。 一般來(lái)說(shuō)處理keyPressed()和keyReleased()都比較容易,但是處理按鍵一直被按下的情況稍微復(fù)雜一些。因?yàn)槲覀兪褂玫脑O(shè)備并不一定支持連續(xù)按鍵的事件。你可以通過(guò)方法hasRepeatEvents()來(lái)檢測(cè)平臺(tái)是否支持當(dāng)按鍵持續(xù)按下的時(shí)候產(chǎn)生重復(fù)事件。如果支持那么你可以在keyRepeated()的方法中處理相關(guān)邏輯,如果不支持那么你必須采取其他的方法。 這里筆者介紹一種通過(guò)設(shè)置標(biāo)志位的方式來(lái)處理連續(xù)按鍵的方法。其實(shí)原理非常的簡(jiǎn)單,我們通過(guò)設(shè)置標(biāo)志位判斷按鍵是否被按下了,比如我們判斷LEFT是不是被按下了。當(dāng)LEFT被按下的時(shí)候,我們把成員變量leftPressed設(shè)置為true,代碼如下: public void keyPressed(int keyCode) switch (action) case LEFT: case RIGHT: default: } } switch (action) case RIGHT: } 這樣我們?cè)谥匦吕L制屏幕的時(shí)候就可以根據(jù)標(biāo)記位的狀態(tài)進(jìn)行繪畫了: 筆者給出一個(gè)簡(jiǎn)單的實(shí)例來(lái)進(jìn)行論證,我們制作一個(gè)MIDlet,當(dāng)用戶按下LEFT的時(shí)候,J2ME字符串向左側(cè)移動(dòng),當(dāng)用戶按下RIGHT的時(shí)候,J2ME字符串向右側(cè)移動(dòng)。簡(jiǎn)單起見,我沒(méi)有處理DOWN和UP的情況。下面是應(yīng)用程序截圖和源代碼。
package com.j2medev; import javax.microedition.lcdui.*; public class KeyActionMIDlet extends MIDlet private Display display; private MainCanvas mainCanvas; protected void startApp() throws MIDletStateChangeException display = Display.getDisplay(this); } protected void pauseApp() } protected void destroyApp(boolean arg0) throws MIDletStateChangeException } } package com.j2medev; import javax.microedition.lcdui.*; public class MainCanvas extends Canvas implements Runnable private boolean leftPressed; private boolean rightPressed; private int px = getWidth() / 2; public final int py = getHeight() / 2; public MainCanvas() private void left() private void right() public void run() try } public void paint(Graphics g) g.drawString(buttonPressed, 20, 20, Graphics.LEFT | Graphics.TOP); } public void keyReleased(int keyCode) switch (action) case RIGHT: } public void keyPressed(int keyCode) switch (action) case LEFT: case RIGHT: default: } } public void keyRepeated(int keyCode) default: } |
只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
|
||