GameLoft公司中关于按键部分处理的疑问

 手机游戏按键部分的疑问:

以下的这段代码来自Gameloft公司内部制作的一款游戏,源码我搞来了,研究了下,发现手机游戏制作过程中的按键部分有点难以理解。至于脚本等那就更难以理解了
不过不要紧,先重简单的来解决

首先观察  keyPressed(int keyCode)
和        keyReleased(int keyCode)

private int s_keyA ;
private int s_keyB ;
private int s_faseCurrentKey ;
private int s_pressedKey ;
private int s_fastCurrentKey ;
private int s_CurrentKey ;
private int s_lastPressed ;

首先观察keyPressed部分

keyPressed(int keyCode)
{
// 这段代码好理解,就是将手机游戏的按键值转化为我们自己定义的值
   s_keyA = getKey(keyCode);

//然后这里的!=s_keyA是什么意思,我就有点不大明白了,继续往下看。
   s_faseCurrentKey  != s_keyA ;
}

其次观察keyReleased部分

 
    protected void keyReleased(int keyCode)
    {

 s_keyB = getKey(keyCode);
//到这里,我首先要请大家帮我分析个语句是撒意思,又与又取反得
        s_fastCurrentKey &= ~s_keyB;

    }

还有一个keyRepeated
 protected void keyRepeated(int keyCode)
    {
        s_fastCurrentKey |= getKey(keyCode);
    }

最后每次sleep,重新调用paint()方法的时候,都要调用updateKey()

;看名字就猜的出来是更新按键了,至于怎么个更新法

参数解释:
结合后面的内容可以推测出:
s_preesedKey指的就是用户按得那个键,好像几个跟按键有关的方法里只用到了s_pressedKey,由此可以推测道所有的其他的参数都是为s_pressedKey服务的

问题就是请哪位前辈帮我分析下这些代码,主要是这些运算符在用于这些数的操作到底是什么意思,分析后给我QQ:523851253,作为回报,我会将此款游戏的全部代码给你,我们

共同研究,并提供我所知道的全部信息

请看内容

    private static void updateKey()
    {
        s_pressedKey = ~s_currentKey & s_fastCurrentKey | (s_keyA & s_keyB);
        s_currentKey = s_fastCurrentKey;
        s_keyA = s_keyB = 0;
        keyTick++;
        if (s_pressedKey != 0)//Const.DBL_PRESS_INTERVAL的值等于6,
        {
            if ( (s_lastPressed != 0) && (keyTick < Const.DBL_PRESS_INTERVAL) &&
                 (s_lastPressed == s_pressedKey))
            {
                    s_lastPressed = 0;
            }
            else
            {
                    keyTick = 0;
                    s_lastPressed = s_pressedKey;
            }
        }
    }

是有点头晕,但是不要着急,先继续往下看,观察下他的代码是如何使用的

如果要判断是否按了某个键的话

    static boolean is_keyPressed(int gameKey)
    {
            return (s_pressedKey & gameKey) != 0;
    }
这个我查了下 如果s_pressedKey和gameKey是相同的,那么返回绝对是true,否则就为false

判断随便按了一个键的方法代码是:

    static boolean is_anyKeyPressed()
    {
            return s_pressedKey != 0;
    }
  
判断一个键是否放了的代码,这个意思我拿不准,hold是拿起的意思,应该是将手机按键抬起的命令

 static boolean is_keyHold(int gameKey)
    {
            return (s_currentKey & gameKey) != 0;
    }

将所有的按键值初始化
 static void keyInit()
    {
            s_currentKey = s_fastCurrentKey = s_pressedKey = s_releasedKey = s_lastPressed = keyTick = 0;
    }

 

这里解释下,有一个类是Const类,里面存放了定义的状态变量和游戏中可能用到得按键值,
比如Const.PADDLE_UP和手机中上键的按键值是相对应的

废话不多说了,这段代码的意思就是将手机游戏的中可能用到得按键值转换为我们自己定义的值
    private static int getKey(int keyCode)
    {

        switch (keyCode)
        {

                case Const.STD_UP_ARROW:

                case Const.PADDLE_UP:

                case KEY_NUM2:

                        return Const.GK_UP;

                case Const.STD_DOWN_ARROW:

                case Const.PADDLE_DOWN:

                case KEY_NUM8:

                        return Const.GK_DOWN;

                case Const.STD_LEFT_ARROW:

                case Const.PADDLE_LEFT:

                case KEY_NUM4:

                        return Const.GK_LEFT;

                case Const.STD_RIGTH_ARROW:

                case Const.PADDLE_RIGHT:

                case KEY_NUM6:

                        return Const.GK_RIGHT;

                case Const.STD_M:

                case Const.PADDLE_CENTER:

                case KEY_NUM5:
                        return Const.GK_M;

                case KEY_NUM0:
                        return Const.GK_NUM0;

                case KEY_NUM1:
                        return Const.GK_NUM1;

                case KEY_NUM3:
                        return Const.GK_NUM3;

                case KEY_NUM9:
                        return Const.GK_NUM9;

                case KEY_NUM7:
                        return Const.GK_NUM7;

                case Const.STD_LEFT_SOFT:

                case Const.PADDLE_SOFT1:

             return Const.GK_RIGHT_SOFT;

               case Const.STD_RIGHT_SOFT:

               case Const.PADDLE_SOFT2:

                     return Const.GK_LEFT_SOFT;

                case Const.PADDLE_SOFT3:
                        return Const.GK_CENTER_SOFT;

    case KEY_POUND:
    case KEY_STAR:

     return 0;

                default:
                        return 0;
        }
    }