<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    解決J2ME開發中的連續按鍵問題

    Posted on 2007-04-28 09:51 笨蛋啊帆 閱讀(224) 評論(0)  編輯  收藏

    本文主要講述在MIDP1.0情況下處理開發過程遇到的連續按鍵事件,結合具體的實例給出一種實用的解決方案。

    我們知道MIDP中的低級事件處理是通過keyPressed()、keyReleased()和keyRepeated()來處理的,分別在按鍵被按下、釋放和重復按鍵的時候被觸發。當方法被調用的時候,系統會把所按下鍵的鍵值傳遞給上述的三個方法,根據按鍵的鍵值我們可以進行相關的處理。在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。

    在游戲開發中為了保證程序的可移植性,通常我們都會把鍵值轉換為游戲動作,在MIDP中定義了如下的游戲動作: UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C,GAME_D。轉換非常簡單,可以通過Canvas提供的方法getGameAction()。

    一般來說處理keyPressed()和keyReleased()都比較容易,但是處理按鍵一直被按下的情況稍微復雜一些。因為我們使用的設備并不一定支持連續按鍵的事件。你可以通過方法hasRepeatEvents()來檢測平臺是否支持當按鍵持續按下的時候產生重復事件。如果支持那么你可以在keyRepeated()的方法中處理相關邏輯,如果不支持那么你必須采取其他的方法。

    這里筆者介紹一種通過設置標志位的方式來處理連續按鍵的方法。其實原理非常的簡單,我們通過設置標志位判斷按鍵是否被按下了,比如我們判斷LEFT是不是被按下了。當LEFT被按下的時候,我們把成員變量leftPressed設置為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();

    }
    當按鍵被釋放的時候,我們就把相關的標記位設置為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();

    }

    這樣我們在重新繪制屏幕的時候就可以根據標記位的狀態進行繪畫了:
    if (leftPressed)
    {
    left();
    }
    if (rightPressed)
    {
    right();
    }

    筆者給出一個簡單的實例來進行論證,我們制作一個MIDlet,當用戶按下LEFT的時候,J2ME字符串向左側移動,當用戶按下RIGHT的時候,J2ME字符串向右側移動。簡單起見,我沒有處理DOWN和UP的情況。下面是應用程序截圖和源代碼。

     

     

     

     

     

    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();

    }
    }


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

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

    Copyright © 笨蛋啊帆

    主站蜘蛛池模板: 亚洲精品欧美综合四区| 亚洲妇女水蜜桃av网网站| 亚洲人成网站在线播放2019 | 免费a级毛片无码av| 亚洲精品无码少妇30P| 三年片在线观看免费大全| 亚洲国产视频网站| 妻子5免费完整高清电视| 日韩高清在线免费观看| 亚洲国产成人久久综合| 国产成人免费a在线资源| 免费看美女午夜大片| 国产亚洲av人片在线观看| 外国成人网在线观看免费视频| 91情国产l精品国产亚洲区| 99爱在线精品免费观看| 亚洲熟妇无码一区二区三区 | 久久亚洲精品无码VA大香大香| 精品无码人妻一区二区免费蜜桃| 亚洲视频在线观看不卡| 最近中文字幕mv免费高清视频7| 亚洲欧美第一成人网站7777| 免费在线观看你懂的| 99精品视频在线观看免费| 亚洲色偷偷av男人的天堂| 女人张腿给男人桶视频免费版 | 日韩亚洲人成网站| 亚洲精品无码永久在线观看 | 亚洲第一街区偷拍街拍| 国产成人麻豆亚洲综合无码精品| 无码A级毛片免费视频内谢| 亚洲一区在线免费观看| vvvv99日韩精品亚洲| 免费精品99久久国产综合精品| 亚洲国产成人在线视频| 午夜亚洲福利在线老司机| 亚洲成人免费在线| 国产亚洲精品91| 亚洲福利视频一区二区三区| 免费一级毛片在线播放不收费| 午夜精品免费在线观看|