一个midlet应用程序通过调用canvas方法来探测哪些键盘代码映射到运行的应用程序中的抽象游戏动作:public static int getgameaction(int keycode); canvas类定义抽象游戏动作集:up、down、left、right、fire等等。 游戏开发者应该知道midp 1.0规范中的一个问题。这个类定义了转化键盘代码到游戏动作的方法,同样也定义了转化游戏动作到键盘代码的方法。public int getgameaction(int keycode)public int getkeycode(int gameaction) 方法getkeycode(int gameaction)可能会导致一些问题,因为它只能返回基于游戏动作的一个键盘代码,即使midp 1.0允许超过一个键盘代码被实现。在nokia手机中,个别的一些键盘代码被映射到相同的游戏动作,比如"up键"和"2键"都被映射为向上的游戏动作。而这个方法只能返回其中之一;返回的值是特定的实现。然而,如果方法getgameaction(int keycode)使用"up键"和"2键"的键盘代码作为参数,这个方法将返回正确的向上的游戏动作。下面来看一个不好的例子,以加深我们的印象:
//不好的例子,不要这么做:class tetriscanvas extends canvas { int leftkey, rightkey, downkey, rotatekey; void init (){ //following must not be done leftkey = getkeycode(left); rightkey = getkeycode(right); downkey = getkeycode(down); rotatekey = getkeycode(fire); }
public void keypressed(int keycode) { if (keycode == leftkey) { moveblockleft(); } else if (keycode = rightkey) {… } }}
下面是更好的解决方案:
class tetriscanvas extends canvas { void init (){ } public void keypressed(int keycode) { int action = getgameaction(keycode); switch (action){ case canvas.left: moveblockleft(); break; case canvas.right: moveblockright(); break; }}}
这个例子是midp 1.0规范中的例子,使用getkeycode ( int gameaction)处理键盘代码值,只能返回一个值。如果这样的话,其它可能的按键映射就不能在midlet中使用了。比如说,在nokia 7650中就会出现问题,nokia 7650有五个方向键和一个操纵杆以及普通的键盘布局,上面这个例子就会返回操纵杆的值而不是键盘的值。这是处理事件的一种与设备无关的方法,也是一种不好的方法。更好的解决方法是在keypressed ()方法内使用getgameaction ( int keycode)。通常,应用程序应该避免使用getkeycode ( int gameaction)方法并且总是使用getgameaction ( int keycode)。
自:yesky.com
