国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

教您如何解決J2ME開發(fā)中的連續(xù)按鍵問題

2019-11-17 06:23:19
字體:
供稿:網(wǎng)友

  本文主要講述在MIDP1.0情況下處理開發(fā)過程碰到的連續(xù)按鍵事件,結(jié)合具體的實(shí)例給出一種實(shí)用的解決方案。我們知道MIDP中的低級(jí)事件處理是通過keyPRessed()、keyReleased()和keyRepeated()來處理的,分別在按鍵被按下、釋放和重復(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)單,可以通過Canvas提供的方法getGameAction()。
  
  一般來說處理keyPressed()和keyReleased()都比較輕易,但是處理按鍵一直被按下的情況稍微復(fù)雜一些。因?yàn)槲覀兪褂玫脑O(shè)備并不一定支持連續(xù)按鍵的事件。你可以通過方法hasRepeatEvents()來檢測(cè)平臺(tái)是否支持當(dāng)按鍵持續(xù)按下的時(shí)候產(chǎn)生重復(fù)事件。假如支持那么你可以在keyRepeated()的方法中處理相關(guān)邏輯,假如不支持那么你必須采取其他的方法。
  
  這里筆者介紹一種通過設(shè)置標(biāo)志位的方式來處理連續(xù)按鍵的方法。其實(shí)原理非常的簡(jiǎn)單,我們通過設(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í)例來進(jìn)行論證,我們制作一個(gè)MIDlet,當(dāng)用戶按下LEFT的時(shí)候,J2ME字符串向左側(cè)移動(dòng),當(dāng)用戶按下RIGHT的時(shí)候,J2ME字符串向右側(cè)移動(dòng)。簡(jiǎn)單起見,我沒有處理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();
  
  }
  }

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 泉州市| 平陆县| 邳州市| 彩票| 镇平县| 平塘县| 武鸣县| 应用必备| 建始县| 信丰县| 徐水县| 乌鲁木齐县| 寻甸| 怀宁县| 监利县| 榆树市| 儋州市| 福海县| 古交市| 阜康市| 炎陵县| 梅河口市| 内黄县| 临澧县| 木兰县| 潞城市| 枞阳县| 嘉定区| 民丰县| 甘孜| 凤阳县| 揭阳市| 安康市| 隆德县| 讷河市| 延安市| 永兴县| 波密县| 英山县| 宽城| 白水县|