我们知道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
{
}
}
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();
}
}
相关推荐
j2me 手机按键对应表、手机按键对应表
手机按键对应表手机按键对应表手机按键对应表手机按键对应表手机按键对应表手机按键对应表手机按键对应表
J2ME游戏按键处理方法简述
J2ME游戏按键处理方法简述 摘要:在游戏当中很多时候,要求按键有更多的响应方式,我们的问题就多起来了。 正文:1.ScanKey()方法这种方法使在keyPressed()、keyRelease()回调中记录按键的情况,每次Game Loop之前使用ScanKey()函数获得需要的记录情况,这次GameLoop都会使用它产生的按键结果。这种方法的缺陷是两次Scankey()
深入探索前端调试神器vConsole
vConsole作为一款前端调试神器,为前端开发者提供了一个便捷的调试解决方案。通过本文的介绍和示例,相信你已经对vConsole有了更深入的了解。然而,vConsole的功能远不止于此,它还有许多高级用法和技巧等待你去发掘。讨论:你在前端开发中是如何使用vConsole的?你有没有发现vConsole的一些隐藏功能或技巧?欢迎在评论区分享你的经验和见解!💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!
关于j2me的按键连按
最近,学习j2me,感觉相当有意思,自己简单练习了一下怎么使得键盘控制更加流畅。感觉还是有一点小的延时,如果有更加好的方法,希望指点一二。 right left up down都是boolean类型的变量 x,y是所要运动物体的坐标 protected void keyPressed(int keyCode) { switch(ge
西门子S7-1200与汇川SV660F伺服Profinet通讯调试实战
在工业自动化领域,Profinet作为工业以太网标准协议,凭借其高实时性和灵活组网能力,已成为伺服驱动器与PLC通讯的主流选择。其核心原理是通过设备名识别、IP分配以及标准报文(如111速度报文、105定位报文)传输控制字与状态字,实现驱动器的精准控制。相比传统脉冲或CANOpen方案,Profinet直连省去了协议转换网关,降低了成本与故障点,尤其适用于绕线设备、包装机械等中小型单轴或多轴运动控制系统。本文以西门子S7-1200 PLC搭配汇川SV660F伺服为例,完整梳理了从GSDMD组态、InoDri
ANSYS 有限元分析 支架拓扑优化设计 分析过程及常见问题解决
1.确定分析类型,所用模块包括两种 static structural Topology Optimization。3.通过草图建立几何模型,建好的几何模型如图1所示。2.工程材料采用默认的Q235。
保姆级教程:用PyTorch手写ArcFace损失函数,从公式到代码逐行解析
本文提供了一份详细的PyTorch教程,手把手教你实现ArcFace损失函数,从公式推导到代码实现逐行解析。通过引入角度间隔惩罚,ArcFace显著提升了人脸识别任务中特征的判别能力。教程涵盖核心原理、代码实现、参数调优及常见问题解决方案,是掌握这一先进技术的实用指南。
手把手教你用Anaconda安装李沐d2l-zh包(附常见报错解决方案)
本文提供了一份详尽的Anaconda环境下安装李沐d2l-zh包的实战指南。文章从创建虚拟环境、配置国内镜像源加速下载入手,分步讲解核心依赖的预安装策略,并重点剖析了安装过程中常见的报错及其解决方法,旨在帮助初学者和开发者高效、稳定地搭建深度学习实验环境。
解决J2ME开发中的连续按键问题
作者:mingjava 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=224本文主要讲述在MIDP1.0情况下处理开发过程遇到的连续按键事件,结合具体的实例给出一种实用的解决方案。 我们知道MIDP中的低级事件处理是通过keyPressed()、keyReleased()和keyRepeated()来处理的,分别
运算放大器测试方法-输入失调电压
由于运放输入回路的不对称性,在输入端将产生一定的误差信号,从而限制运放信号灵敏度。通常用输入失调电压(VOS)、输入失调电流(Ios)和输入偏置电流(IB)表示。运放有四个主要特征:输入失调特征、开环特征、共模特征及输出特征。其放大倍数较大,由于外界的影响,即使运放的输入端产生较小的输入信号,经过放大,在输出端也会产生较大的误差。为能精确测量其性能,一般采用辅助运放进行测试。下面着重讲了运放的主要参数及如何精确测量这些参数。文中DUT代表被测运放,A代表辅助运放。
Jetson nano 系列之2—板载摄像头IMX219启动
我选用的是亚博科技jetson nano的开发板。
J2ME开发笔记-键盘响应
J2ME开发笔记-键盘响应 不同的机型对于键盘事件的响应不一样。经过我的测试,Nokia 7210,3100一次只能接受一个按键信息。(我写了个测试程序,发现如果一个键被按下后没有松开,则KeyPressed事件不会再产生,即其他键的按下操作无效)所以,用缓冲处理控制精灵运动时,如果规定只能四方向运动。如果up已按下,再按下left,精灵的运动方向并不会改变。不过将按键缓冲。按下up,按下le
连接参数详解:Connection Interval, Slave Latency, Supervision Timeout 的协同与调优实战
在低功耗蓝牙(BLE)开发与调试中,Connection Interval(连接间隔)、Slave Latency(从机延迟) 和 Supervision Timeout(监督超时) 是三个核心参数。它们不仅直接影响设备的通信性能、功耗表现和连接稳定性,更是各类技术面试与认证考试的高频考点。本文将从基础概念出发,深入剖析三者的协同机制,结合历年真题解析考点与解题思路,并通过实战案例演示调优方法,快速掌握这一核心知识点。
在JBuilder里建立第一个J2ME游戏项目
File -> New Project 填上名字: Name:随便 目录: Directory:随便 点Next. 然后选择JDK,点 ..., 如果是JBuilder 2005选择 J2ME Wireless Toolkit 2.1 JBuilder 2006选择 J2ME Wireless Toolkit 2.2。 点Next. 点Finish. 第一步完成。 ----------------
用 sapgenpse 把 SAPCRYPTOLIB 的 SNC 真正配通
摘要: 在SAP系统中配置SNC(Secure Network Communications)时,sapgenpse工具是关键,尤其在旧版本或组件缺乏图形化维护工具时。核心步骤包括安装SAP Cryptographic Library、创建PSE(Personal Security Environment)、生成运行凭据,并确保证书交换顺序正确。常见问题如RFC连接失败或握手错误,往往源于PSE创建或凭据配置不当。需特别注意SECUDIR目录设置、PSE身份管理(单一或独立PSE方案)、以及服务账号凭据的权
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
Effective J2ME(4)
本文节选于笔者在数年前开发手机游戏时总结的一份文档。一家之言,贻笑大方。3 J2ME开发中的常见问题 由于J2ME相关资料比较少,所以在开发过程中经常会遇到现象诡异的问题。有些问题解决了,有些绕过了。以下总结了一些比较典型的问题和解决方法。3.1 按键响应迟钝 造成按键响应迟钝的最常见的原因是程序中的其它线程占用了绝大多数的CPU时间,从而导致负责事件转发的系...
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
实例论证J2ME的事件传输机制
作者:mingjava 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=119本文主要阐述的问题是,在J2ME开发中事件的传输到底是什么机制。主要围绕Canvas类事件传输的串行化进行分析和研究,通过实例进行论证并在最后得出结论。 通过参考Java doc我们可以知道在J2ME中的事件传输是串行化的,那么什么是串
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
从J2ME学Symbian游戏开发(一)
相信在手机游戏开发这块是J2ME的天下,一是因为它简单容易学,二是因为关于它的资料多。 而J2ME毕竟是运行在Symbian OS的内核之上的,速度慢也是必然的了,更不能忍受的是它把很多与底层的交互封装了起来,并且不提供接口让你访问。 这对于我这样喜欢刨根问低的人来说,是实在无法忍受的! 其实真正了解了Symbian OS和相应的Serie
使用NetBeans进行J2ME开发(三):低级图形用户界面Canvas
使用NetBeans进行J2ME开发(三):低级图形用户界面Canvas 在这一篇中,我将向大家介绍图形用户界面中的低级图形用户界面。所谓低级图形用户界面,指的是那种我们可以自己在上面画图的控件,它是和TextBox, List等等这些用户控件刚好相对的概念,因为这些用户控件的形状是事先画好的,无需我们程序员操心,所以称为高级图形界面。低级图形用户界面什么东西都 需要我们自己画,所以比
3148



被折叠的 条评论
为什么被折叠?



