本文主要講述在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)
          {
          int action = getGameAction(keyCode);

          switch (action)
          {

          case LEFT:
          left();
          leftPressed = true;
          break;

          case RIGHT:
          right();
          rightPressed = true;
          break;

          default:
          break;

          }
          repaint();

          }
          當(dāng)按鍵被釋放的時(shí)候,我們就把相關(guān)的標(biāo)記位設(shè)置為false。
          public void keyReleased(int keyCode)
          {
          int action = getGameAction(keyCode);

          switch (action)
          {
          case LEFT:
          leftPressed = false;
          buttonPressed = "";
          break;

          case RIGHT:
          rightPressed = false;
          buttonPressed = "";
          break;
          default:
          break;
          }
          repaint();

          }

          這樣我們?cè)谥匦吕L制屏幕的時(shí)候就可以根據(jù)標(biāo)記位的狀態(tài)進(jìn)行繪畫了:
          if (leftPressed)
          {
          left();
          }
          if (rightPressed)
          {
          right();
          }

          筆者給出一個(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.*;
          import javax.microedition.midlet.MIDlet;
          import javax.microedition.midlet.MIDletStateChangeException;

          public class KeyActionMIDlet extends MIDlet
          {

          private Display display;

          private MainCanvas mainCanvas;

          protected void startApp() throws MIDletStateChangeException
          {

          display = Display.getDisplay(this);
          mainCanvas = new MainCanvas();
          new Thread(mainCanvas).start();
          display.setCurrent(mainCanvas);

          }

          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 String buttonPressed;

          private boolean leftPressed;

          private boolean rightPressed;

          private int px = getWidth() / 2;

          public final int py = getHeight() / 2;

          public MainCanvas()
          {
          buttonPressed = " ";
          }

          private void left()
          {
          if (px >= 0)
          {
          px--;
          }
          buttonPressed = "LEFT";
          repaint();
          }

          private void right()
          {
          if (px <= getWidth())
          {
          px++;
          }
          buttonPressed = "RIGHT";
          repaint();
          }

          public void run()
          {
          while (true)
          {
          if (leftPressed)
          {
          left();
          }
          if (rightPressed)
          {
          right();
          }

          try
          {
          Thread.sleep(50);
          } catch (InterruptedException e)
          {
          e.printStackTrace();
          }
          }

          }

          public void paint(Graphics g)
          {
          g.setColor(0xFFFFFF);
          g.fillRect(0, 0, getWidth(), getHeight());
          g.setColor(0x000000);

          g.drawString(buttonPressed, 20, 20, Graphics.LEFT | Graphics.TOP);
          g.drawString("J2ME", px, py, Graphics.HCENTER | Graphics.TOP);

          }

          public void keyReleased(int keyCode)
          {
          int action = getGameAction(keyCode);

          switch (action)
          {
          case LEFT:
          leftPressed = false;
          buttonPressed = "";
          break;

          case RIGHT:
          rightPressed = false;
          buttonPressed = "";
          break;
          default:
          break;
          }
          repaint();

          }

          public void keyPressed(int keyCode)
          {
          int action = getGameAction(keyCode);

          switch (action)
          {

          case LEFT:
          left();
          leftPressed = true;
          break;

          case RIGHT:
          right();
          rightPressed = true;
          break;

          default:
          break;

          }
          repaint();

          }

          public void keyRepeated(int keyCode)
          {
          int action = getGameAction(keyCode);
          switch (action)
          {
          case LEFT:
          left();
          break;
          case RIGHT:
          right();
          break;

          default:
          break;
          }
          repaint();

          }
          }


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          posts - 51, comments - 17, trackbacks - 0, articles - 0

          Copyright © 笨蛋啊帆

          主站蜘蛛池模板: 乡宁县| 博白县| 丹棱县| 固阳县| 大埔区| 钦州市| 镇巴县| 泗阳县| 永兴县| 巫山县| 佛坪县| 湟源县| 游戏| 邯郸县| 调兵山市| 虹口区| 建德市| 滦平县| 子洲县| 邹城市| 将乐县| 兰坪| 大埔县| 定远县| 西宁市| 文成县| 宁南县| 茌平县| 永平县| 东乌珠穆沁旗| 武夷山市| 沧源| 苏尼特右旗| 汾西县| 连平县| 蕉岭县| 凌云县| 云龙县| 武胜县| 洞口县| 丹巴县|