`
feng_home
  • 浏览: 35567 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

J2ME开发中的连续按键问题

    博客分类:
  • j2me
阅读更多

我们知道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的情况。

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

 

分享到:
评论

相关推荐

    解决J2ME开发中的连续按键问题

    在J2ME游戏开发中,处理用户输入是一个关键部分,特别是对于连续按键的处理,因为这直接影响到游戏的响应性和玩家体验。J2ME(Java 2 Micro Edition)提供了MIDP(Mobile Information Device Profile)框架,用于...

    J2ME手机计算器触屏按键功能

    在本文中,我们将深入探讨如何在Java平台上,特别是在J2ME(Java Micro Edition)环境中,实现一个具有触屏按键功能的手机计算器应用。这个计算器应用允许用户通过触屏操作进行数学计算,提供了一种便捷的方式来处理...

    J2ME 游戏开发(基本功能开发)

    在J2ME中进行游戏开发,开发者可以利用其跨平台特性,将游戏移植到各种不同的设备上。本教程将探讨J2ME游戏开发的基本功能,特别是人物和地图的绘制。 **1. J2ME游戏架构** 在J2ME中,游戏通常基于MIDP(Mobile ...

    使用J2ME技术开发RPG游戏(二)——按键处理机制.doc

    在使用J2ME技术开发RPG游戏的过程中,按键处理机制是一个关键部分,它关系到游戏的响应速度和玩家体验。本文将深入探讨如何构建这样一个高效、可移植的按键处理系统。 首先,为了确保游戏对按键的反应快速且灵敏,...

    j2me游戏开发及其源码.rar_J2ME游戏_j2me_j2me game source_j2me 游戏_j2me游戏开发

    在J2ME游戏开发中,你需要了解以下几个核心知识点: 1. **基础环境配置**:首先,开发者需要安装Java SDK和J2ME Wireless Toolkit (J2ME WTK)。J2ME WTK提供了模拟器和开发工具,帮助开发者编写、测试和调试J2ME...

    j2me 手机游戏 开发基础教程

    J2ME中的持久化数据存储主要依赖于`RecordStore` API,它可以用来保存用户得分、游戏进度等信息。 ### 7. 网络功能 如果设备支持,MIDP API允许游戏与服务器交互,实现在线排行榜、多人对战等功能。`...

    j2me_plane.rar_j2me_j2me 飞机_j2me 飞机 游戏_飞机游戏

    总结来说,通过J2ME开发飞机游戏,开发者需要掌握MIDP和CLDC的基本概念,熟悉Canvas的绘图机制,理解事件处理和游戏逻辑,以及可能涉及的网络编程。对于初学者而言,这是一个很好的实践项目,不仅可以学习到基础的...

    J2ME改变速度的小球

    在这个特定的例子中,我们关注的是如何控制游戏中的小球移动速度,以及处理连续按键和非连续按键事件。 首先,我们要理解J2ME中的Canvas类。Canvas是J2ME图形用户界面的基础,它提供了一个空白的画布,开发者可以在...

    J2ME 画布实现中文输入

    在Java Micro Edition (J2ME) 平台上开发移动应用时,由于资源限制,往往需要进行一些巧妙的设计来实现特定功能。"J2ME 画布实现中文输入"这一主题,就是针对在J2ME环境下如何创建一个自定义的中文输入系统进行探讨...

    J2ME 五子棋源代码

    在这个特定的案例中,我们讨论的是一个基于J2ME的五子棋游戏,这是一个经典的人机对弈程序,内置了人工智能(AI)算法。 五子棋,也称为连珠,是源自中国的两人对弈策略游戏,目标是在棋盘上首先形成连续五个同色...

    俄罗斯方块J2ME下载

    通常情况下,这可能指的是一个包含多种测试或学习材料的压缩文件,比如用于准备关于J2ME开发或者游戏设计的综合考试。这样的文件可能包括代码示例、游戏分析、理论文档、模拟试题等,帮助学习者全面理解和掌握J2ME...

    第五章低级用户界面及事件处理--j2me开发.ppt

    【低级用户界面与事件处理】在J2ME开发中,低级用户界面是指通过基本的API进行定制化的界面设计,通常涉及到Canvas类的使用。Canvas是Displayable的一个子类,提供了一种直接操作设备屏幕像素的能力,适用于需要精细...

    一个简单的J2ME动画代码

    J2ME(Java 2 Platform, Micro Edition)是Java平台的一个重要分支,主要用于开发和运行在移动设备、嵌入式设备以及智能家电等小型设备上的应用程序。它提供了丰富的API,使开发者能够创建功能丰富的、交互性强的...

    机器猫--j2me游戏源码

    游戏开发中,通常会用到J2ME的图形库,例如Graphics类,来绘制游戏场景、角色和其他元素。开发者可能使用了事件驱动的编程模型,监听用户的按键输入,以此控制游戏的进程。同时,为了实现动态效果,可能还涉及到了帧...

    J2ME三种低级用户界面事件处理技术比较

    这种方式由手机制造商实现,允许不同手机上的按键执行相似的游戏动作,大大简化了游戏开发中的按键处理逻辑。 具体的,`gameAction`通过`getGameAction(keyCode)`函数将`keyCode`转换为游戏动作。这些动作包括但不...

    J2ME 小游戏 五子棋

    【Eclipse与J2ME开发】 Eclipse是一个广泛使用的开源集成开发环境(IDE),支持多种编程语言,包括Java。尽管Eclipse最初主要用于Java桌面应用开发,但通过安装特定的插件,如J2ME Wireless Toolkit(J2ME WTK)或...

    SUN官方的J2ME游戏实例源码集.rar

    这份源码集由SUN公司官方提供,旨在帮助开发者理解并掌握J2ME(Java 2 Micro Edition)平台上的游戏开发技术。J2ME是Java的一个子集,主要用于移动设备、嵌入式系统和其他资源有限的计算环境,因此,它在游戏开发...

    J2ME手机游戏编程入门源代码

    总的来说,通过分析这个J2ME手机游戏编程的源代码,你不仅可以学习到J2ME平台的基础知识,还能掌握游戏开发中的核心概念和技术,从而为自己的游戏开发之路打下坚实的基础。这是一个很好的实践平台,可以让你在实践中...

    J2ME手机游戏贪吃蛇小游戏

    我们需要在事件处理函数中更新蛇的移动方向,同时确保游戏不会因为瞬间的连续按键而让蛇立即改变方向。 3. **图形绘制**:J2ME使用`Graphics`类进行基本的2D绘图。在贪吃蛇游戏中,我们首先需要创建一个画布,然后...

    J2ME音乐手机游戏

    游戏开发过程中,还需要考虑设备兼容性,因为J2ME应用需要在各种具有不同屏幕尺寸、内存和处理器能力的设备上运行。因此,开发者通常需要进行广泛的设备测试和适配工作。 总结来说,"J2ME音乐手机游戏"是一款结合了...

Global site tag (gtag.js) - Google Analytics