在keyPressed里面,我们先将keyCode转换成我们的按键常量,就是上面的GKEY_0等。因为keyCode可不是像我们的常量那样可以用某个位表示的,而且不同手机的keyCode是有可能不一样的,所以我们必须用一个函数getKeyValue进行转化。得到常量后key|=value的作用是将key里面常量所代表的位置1,现在你应该明白常量的作用了吧!pressedKey|=value同理。不过keyReleased有些不同,由于releasedKey只记录这一帧里哪些键“被松开”了,所以仍然用或运算。但key是记录整个按键的状态,所以用异或。
接下来就是如何判断按键状态了:
private static void acquireKey()
{
frameKey = key ;
framePressedKey = pressedKey ;
frameReleasedKey = releasedKey ;
pressedKey = 0 ;
releasedKey = 0 ;
}
public static boolean keyHold(int gameKey)
{
return ((frameKey & gameKey)!=0) ;
}
public static boolean keyDown(int gameKey)
{
return ((framePressedKey & gameKey)!=0) ;
}
public static boolean keyUp(int gameKey)
{
return ((frameReleasedKey & gameKey)!=0) ;
}
还记得acquireKey吧,我们在while循环中首先要调用它,其作用就是记录下这一帧的按键状态,所有我们用了三个新int变量记录他们,分别是frameKey,framePressedKey和frameReleasedKey。acquireKey所做的就是将按键状态记录在这3个变量中,其实framePressedKey和frameReleasedKey不是必须的,只是这样看上去比较清楚。记录完后我们将pressedKey和releasedKey清空,以便下次有键按下或松开时记录新的信息。关键的三个函数登场了,keyDown判断某个键是否在这一帧里被按下,参数gameKey是我们定义的按键常量中的某个值。如果对位运算还算明白的话,很容易看懂这3个函数。唯一要说明的就是keyHold和keyDown的区别,keyHold表示某个键一直被按着,也就是至少从前一帧开始它就被按下了,而不是在这一帧里被按下的。现在你应该明白我们为什么要清空pressedKey和releasedKey了。
说到这里也差不多了,有了这个按键缓冲我们就可以在gameLoop中调用keyDown等方法判断按键的状态了。不过我还是要说一句,这只是最简单的按键缓冲,只能缓冲一次按键,如果一个键被多次按下就不行啦。更专业的内容需要你在实际工作中探索。