作者:潇潇  出处:www.j2mefans.com
该文章为本站原创,如有引用,请注明出处和作者


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

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;
  }
 }

}