MIDP1.0中处理键盘输入
该文章为本站原创,如有引用,请注明出处和作者
交互性的游戏离不开用户的输入,对于手机来说主要的输入工具就是键盘了,虽然小,但功能很齐全。
1、按键代码
当用户按下某个键时,程序就会接受到按键事件。每一个按键都被分配一个键码(keyCode)。如KEY_NUM0 的值为 48 ,而他的按键名称为0,KEY_NUM9的值为57,按键名称为9,中间的2~8,按循序分布。
2、按键事件
总的来说,处理按键事件的有下面3种方法:
protected void keyPressed( int keyCode ),当按键按下时触发。
protected void keyReleased( int keyCode ) ,当键盘释放时触发。
protected void keyRepeated( int keyCode ),当键盘重复石调用
下面是MIDP1.0中常见的方法,直接在代码中添加下面语句即可:
public void keyPressed(int keyCode)
{
swith(keyCode)
{
case 48
//添加自己的动作
break;
case 48
//添加自己的动作
break;
case 48
//添加自己的动作
break;
default:
//添加自己的动作
break;
}
}
当然我们还可以使用getKeyName(keyCode);得到按键的名字。
3、游戏中的动作
对于游戏来说,我们不可能要求每种手机的按键功能都一样,为了提高应用程序的可移植性,我们常使用游戏动作来替代键码。如:游戏动作UP,DOWN, LEFT, RIGHT, FIRE等。
不管手机中实际使用那五个键表示这四个动作,我们都可以使用getGameAction()方法将键码转换为游戏动作。
按么我们的代码就变成了下面的形式:
//处理按键信息
public void keyPressed(int keyCode)
{
int keystates = getGameAction(keyCode);
switch(keystates)
{
case UP:
y = Math.max(0, y - 2);
break;
case DOWN:
y = Math.min(getHeight(), y + 2);
break;
case LEFT:
x = Math.max(0, x - 2);
break;
case RIGHT:
x = Math.min(getWidth(), x + 2);
break;
}
}
下面我们实际的写了一个例子,我们可以在其中使用游戏键来控制屏幕上小方块的移动:
例子程序:
/**
* 文件名:Ocanvas.java
* 画布类
*/
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.*;
import java.lang.Thread;
public class OCanvas extends Canvas implements Runnable
{
//定义变量
private Display display;
private boolean sleeping;
private long frameDelay;
private int XSpeed,YSpeed;
private int x,y;
public OCanvas(Display d)
{
//类构造函数,初始化类变量
super();
display = d;
// 设置帧频 (30 fps)
frameDelay = 33;
}
void start()
{
// 设置这个画布为当前屏幕
display.setCurrent(this);
// 初始化一些游戏中的变量,载入相关图片
x=getWidth()/2-10;
y=getHeight()/2-10;
XSpeed = YSpeed = 3;
// 开始动画线程
sleeping = false;
Thread t = new Thread(this);
t.start();
}
public void stop() {
// 停止动画线程
sleeping = true;
}
public void run() {
// 动画线程开始后运行
// 主游戏循环
while (!sleeping) {
//更新屏幕显示
repaint();
//线程休眠
try {
Thread.sleep(frameDelay);
}
catch (InterruptedException ie) {}
}
}
//这里添加对屏幕的绘制
public void paint(Graphics g)
{
// 清除屏幕
g.setColor(0xffffffff);
g.fillRect(0, 0, getWidth(), getHeight());
// 重绘屏幕
g.setColor(0,0,0);
g.fillRect(x,y,20,20);
}
//处理按键信息
public void keyPressed(int keyCode)
{
int keystates = getGameAction(keyCode);
switch(keystates)
{
case UP:
y = Math.max(0, y - 2);
break;
case DOWN:
y = Math.min(getHeight(), y + 2);
break;
case LEFT:
x = Math.max(0, x - 2);
break;
case RIGHT:
x = Math.min(getWidth(), x + 2);
break;
}
}
}