写文章对我来说真是件痛苦的事,从小学到高中,语文成绩能够及格一直都是个奢侈的梦想, 没办法,还是忍不住要写出来,权当补补语文吧!下面就讲讲我在移植Midp游戏到Doja过程中是如何进行按键映射的,希望对大家有帮助。
不论是midp手机还是doja手机,键盘上的按键都是差不多的,基于这个实事,我们只需要把doja中的键值修改为相应的midp键值即可。
Midp中跟按键相关的常用函数包括:keyPressed(),keyReleased(),getGameAction(),一般很少用keyRepeated(), getKeyCode() ,getKeyName() 和触摸笔函数,在这里就不讨论了。而Doja中的函数只讨论processEvent(), 移植过程中很少涉及getKeypadState()函数,也不讨论。所以我们要做的就是如何把processEvent()函数还原成midp中的函数,具体做法如下:
Step 1、反编译midp中的Canvas.class,拷贝其键值常量:
为什么我们要拷贝这些常量呢?因为在实际情况中,我们拿到的midp代码千奇百怪,很多代码直接在逻辑中使用数字来判断按键情况,这让代码阅读起来很不放便,就跟别说修改了,虽然最终都能根据代码推导出来,但却白白的浪费了时间,也就直截了当的浪费了生命。下面是常用的键值:
public static final int UP = 1;
public static final int DOWN = 6;
public static final int LEFT = 2;
public static final int RIGHT = 5;
public static final int FIRE = 8;
public static final int GAME_A = 9;
public static final int GAME_B = 10;
public static final int GAME_C = 11;
public static final int GAME_D = 12;
public static final int KEY_NUM0 = 48;
public static final int KEY_NUM1 = 49;
public static final int KEY_NUM2 = 50;
public static final int KEY_NUM3 = 51;
public static final int KEY_NUM4 = 52;
public static final int KEY_NUM5 = 53;
public static final int KEY_NUM6 = 54;
public static final int KEY_NUM7 = 55;
public static final int KEY_NUM8 = 56;
public static final int KEY_NUM9 = 57;
public static final int KEY_STAR = 42;
public static final int KEY_POUND = 35;
另外:
左右键要根据具体的机型来确定,这里以Nokia为例:
public static final int KEY_SOFTKEY1 = -6;
public static final int KEY_SOFTKEY2 = -7;
Step 1、实现getGameAction()函数:
Midp游戏中会经常使用这个函数,所以我们在doja代码中实现它。
public static int getGameAction(int keyCode) {
switch (keyCode) {
case KEY_NUM2:
keyCode = UP;
break;
case KEY_NUM4:
keyCode = LEFT;
break;
case KEY_NUM6:
keyCode = RIGHT;
break;
case KEY_NUM8:
keyCode = DOWN;
break;
case KEY_NUM5:
keyCode = FIRE;
break;
}
return keyCode;
}
Step 3、建立键值映射表:
这里没有全部映射,需要根据实际情况增加或减少映射内容,Doja Jar size被 限制在30k以内了,该省的就省吧,小日本就是扣。
public static final int DOJA2MIDP_KEYS[][] = {
{
Display.KEY_2, KEY_NUM2}
, {
Display.KEY_4, KEY_NUM4}
, {
Display.KEY_6, KEY_NUM6}
, {
Display.KEY_8, KEY_NUM8}
, {
Display.KEY_UP, UP}
, {
Display.KEY_LEFT, LEFT}
, {
Display.KEY_RIGHT, RIGHT}
, {
Display.KEY_DOWN, DOWN}
, {
Display.KEY_5, KEY_NUM5}
, {
Display.KEY_SELECT, FIRE}
, {
Display.KEY_SOFT1, KEY_SOFTKEY1}
, {
Display.KEY_SOFT2, KEY_SOFTKEY2}
};
Step 4、实现按键映射:
原理很简单,我们只要在processEvent()中转换键值并分配给keyPressed(), keyReleased()即可。
代码如下:
public void processEvent(int type, int c) {
//映射键值
int tempKey = 0;
for (int i = 0; i < DOJA2MIDP_KEYS.length; i++) {
if (c == DOJA2MIDP_KEYS[i][0]) {
tempKey = DOJA2MIDP_KEYS[i][1];
break;
}
}
c = tempKey;
//分配按键
if (type == Display.KEY_PRESSED_EVENT ) {
keyPressed(c);
}else {
keyReleased(c);
}
}
总结:这样我们就可以在不修改原来任何函数的条件下把midp代码中关于按键部分移植到doja中去。