`
wo_deqing
  • 浏览: 60439 次
文章分类
社区版块
存档分类
最新评论

J2ME 事件处理(笔的移动,键盘输入)

 
阅读更多

处理笔的移动

处理 PDA 显示器上笔的移动的事件处理程序有:penDown、penMove 和 penUp。

l 当用户将笔在显示器上移动时,penDown() 方法将被调用,它传递显示器上笔的放置点的 X 和 Y 轴坐标。

public void penDown( int x, int y )

l 当用户在显示器上移动笔时 penMove() 过程将被调用。X 和 Y 轴坐标定义笔的当前位置。

public void penMove( int x, int y )

l 当用户将笔从显示器上移开时 penUp() 过程将被调用,它传递两个参数:笔被移开点的 X 和 Y 轴坐标。

public void penUp( int x, int y )


处理键盘输入,电子束定向发送/接收,以及未知事件

在 J2SE AWT 中,接口 java.awt.event.KeyListener 包含处理不同键盘事件的 keyPressed、keyReleased 和 keyTyped。与此相比,KJava 则只有一个函数,keyDown()。

如果用户在可书画区写下一个字符,按下计算器或菜单图标,或者是按下任何“硬键”(缺省情况下,Date Book、Address、page up、page down、To Do List 或是 Memo Pad key )时,事件 keyDown 就会被调用。参数 keyCode 标识用户输入的键的代码。如果按了其中一个“硬键”,事件 keyDown 就开始匹配这个类中定义过的相应常量中的一个。

public void keyDown( int keyCode )

beamReceive() 方法被用于接收从红外线 Palm 设备传来的数据包。数据以一种字节数组的方式被接收,并用虚拟机自动分配这些数据。

public static boolean beamReceive( byte[] data )

beamSend() 方法不是一个事件处理程序,但是它显然与 beamReceive() 相关联,所以我们在这儿还是要提一下。这种方法被用来给发送到另一个红外线 Palm 设备的数据包定向。在给数据定向时,您可以调用这个函数,但是目标设备必须在接收数据的 spotlet 中注册一个 beamReceive 处理器。

public static boolean beamSend( byte[] data )

unknownEvent 是一个常规的所有未知事件处理例程。

public void unknownEvent( int event, java.io.DataInput in )


定义方法和事件处理程序

此外,main() 定义了应用程序的主要入口。

public static void main(String[] args)

默认的构造程序,Scribble 初始化成员变量,清屏并画出初始框架。

public Scribble()

paint() 方法负责更新或刷新显示。它使用类变量 g -- 一个 Graphics 对象,类似于 Java 2 AWT 中使用的 Graphics 对象。

private void paint()

penDown() 方法执行事件处理程序来处理在屏幕上放置笔的事件。它通过 X 和 Y 坐标来定位。在 Scribble 中,程序测试 Clear 或 Exit 按钮是否被按下,如果按下的话,就处理相应的事件。

public void penDown(int x, int y)

keyDown() 方法处理那些在 Palm 设备的即兴书画框内随手写下的东西。传送到这个方法中的整型值 keyCode 就是输入的字符键值。在 Scribble 应用程序中,我们存储了成员变量 lastKey 中被按下的键,然后调用 paint() 方法刷新屏幕。

public void keyDown(int keyCode)

penMove() 方法处理在屏幕上拖动笔的事件。在 Scribble 中,它负责用笔绘画。

public void penMove(int x, int y)

使用的最后一个方法 clearDrawingArea(),在用户按下 Clear 按钮时由 penDown 事件处理程序调用。由于它仅在 Scribble 类的内部使用,所以 clearDrawingArea() 是一个私有方法。

private void clearDrawingArea()



交互性的游戏离不开用户的输入,对于手机来说主要的输入工具就是键盘了,虽然小,但功能很齐全。

1、按键代码

当用户按下某个键时,程序就会接受到按键事件。每一个按键都被分配一个键码(keyCode)。如KEY_NUM0的值为48,而他的按键名称为0,KEY_NUM9的值为57,按键名称为9,中间的2~8,按循序分布。

2、按键事件

总的来说,处理按键事件的有下面3种方法:
protectedvoidkeyPressed(intkeyCode),当按键按下时触发。
protectedvoidkeyReleased(intkeyCode),当键盘释放时触发。
protectedvoidkeyRepeated(intkeyCode),当键盘重复石调用

下面是MIDP1.0中常见的方法,直接在代码中添加下面语句即可:
publicvoidkeyPressed(intkeyCode)
{
swith(keyCode)
{
case48
//添加自己的动作
break;
case48
//添加自己的动作
break;
case48
//添加自己的动作
break;
default:
//添加自己的动作
break;
}
}
当然我们还可以使用getKeyName(keyCode);得到按键的名字。

3、游戏中的动作

对于游戏来说,我们不可能要求每种手机的按键功能都一样,为了提高应用程序的可移植性,我们常使用游戏动作来替代键码。如:游戏动作UP,DOWN,LEFT,RIGHT,FIRE等。
不管手机中实际使用那五个键表示这四个动作,我们都可以使用getGameAction()方法将键码转换为游戏动作。
按么我们的代码就变成了下面的形式:

//处理按键信息
publicvoidkeyPressed(intkeyCode)
{
intkeystates=getGameAction(keyCode);
switch(keystates)
{
caseUP:
y=Math.max(0,y-2);
break;
caseDOWN:
y=Math.min(getHeight(),y+2);
break;
caseLEFT:
x=Math.max(0,x-2);
break;
caseRIGHT:
x=Math.min(getWidth(),x+2);
break;
}
}

下面我们实际的写了一个例子,我们可以在其中使用游戏键来控制屏幕上小方块的移动:

例子程序:

/**
*文件名:Ocanvas.java
*画布类
*/

importjavax.microedition.lcdui.*;
importjava.io.*;
importjava.util.*;
importjava.lang.Thread;

publicclassOCanvasextendsCanvasimplementsRunnable
{
//定义变量
privateDisplaydisplay;
privatebooleansleeping;
privatelongframeDelay;

privateintXSpeed,YSpeed;
privateintx,y;

publicOCanvas(Displayd)
{
//类构造函数,初始化类变量
super();
display=d;

//设置帧频(30fps)
frameDelay=33;
}

voidstart()
{

//设置这个画布为当前屏幕
display.setCurrent(this);

//初始化一些游戏中的变量,载入相关图片
x=getWidth()/2-10;
y=getHeight()/2-10;
XSpeed=YSpeed=3;

//开始动画线程
sleeping=false;
Threadt=newThread(this);
t.start();
}

publicvoidstop(){
//停止动画线程
sleeping=true;
}

publicvoidrun(){
//动画线程开始后运行

//主游戏循环
while(!sleeping){
//更新屏幕显示
repaint();
//线程休眠
try{
Thread.sleep(frameDelay);
}
catch(InterruptedExceptionie){}
}
}


//这里添加对屏幕的绘制
publicvoidpaint(Graphicsg)
{
//清除屏幕
g.setColor(0xffffffff);
g.fillRect(0,0,getWidth(),getHeight());

//重绘屏幕
g.setColor(0,0,0);
g.fillRect(x,y,20,20);

}

//处理按键信息
publicvoidkeyPressed(intkeyCode)
{
intkeystates=getGameAction(keyCode);
switch(keystates)
{
caseUP:
y=Math.max(0,y-2);
break;
caseDOWN:
y=Math.min(getHeight(),y+2);
break;
caseLEFT:
x=Math.max(0,x-2);
break;
caseRIGHT:
x=Math.min(getWidth(),x+2);
break;
}
}

}

分享到:
评论

相关推荐

    Google Android SDK开发范例大全(第3版) 1/5

    超酷的娱乐多媒体设计:触控移动事件、建立手势、手势判断控制、屏幕保护程序、启动动画、mp3播放器、3gp影片播放、相机预览拍照、自动对焦、调整音量、信息指令遥控手机、录音控制、自定义动画按钮等 Web Service...

    Google Android SDK开发范例大全(第3版) 4/5

    超酷的娱乐多媒体设计:触控移动事件、建立手势、手势判断控制、屏幕保护程序、启动动画、mp3播放器、3gp影片播放、相机预览拍照、自动对焦、调整音量、信息指令遥控手机、录音控制、自定义动画按钮等 Web Service...

    Google Android SDK开发范例大全(第3版) 3/5

    超酷的娱乐多媒体设计:触控移动事件、建立手势、手势判断控制、屏幕保护程序、启动动画、mp3播放器、3gp影片播放、相机预览拍照、自动对焦、调整音量、信息指令遥控手机、录音控制、自定义动画按钮等 Web Service...

    Google Android SDK开发范例大全(第3版) 5/5

    超酷的娱乐多媒体设计:触控移动事件、建立手势、手势判断控制、屏幕保护程序、启动动画、mp3播放器、3gp影片播放、相机预览拍照、自动对焦、调整音量、信息指令遥控手机、录音控制、自定义动画按钮等 Web Service...

    JAVA上百实例源码以及开源项目

    原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制  Java二进制IO类与文件...

    JAVA上百实例源码以及开源项目源代码

    原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制...

    Symbian系统

    与微软产品不同的是,Symbian将移动设备的通用技术,也就是操作系统的内核,与图形用户界面技术分开,能很好的适应不同方式输入的平台,也可以使厂商可以为自己的产品制作更加友好的操作界面,符合个性化的潮流,这...

    新版Android开发教程.rar

    QWERTY 全键盘; 310 万像素摄像头。 流媒体 支持视频格式: H.264 、流媒体、 3GPP 、 MPEG4 和 Codec 3GP ;支持音频格式: MP3 、 AAC 、 AAC+ 、 W MA 、 MPEG4 、 WAV 、 MIDI 、 REAL 、 AUDIO 和 OGG ;支持...

Global site tag (gtag.js) - Google Analytics