交互性的游戲離不開用戶的輸進,對於手機來說重要的輸進工具就是鍵盤了,固然小,但功效很齊全。
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;
}
}
}