科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道J2ME专业手机游戏开发基础

J2ME专业手机游戏开发基础

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

游戏的基本结构 游戏是什么呢?在游戏中,往往是显示各种各样的画面,玩家可以做一些设定好的控制,画面根据玩家的控制有所变化。从这儿可以看出,游戏至少需要三个功能-显示画面,接受玩家输入和对输入产生反馈。这就是常说的渲染。

作者:中国IT实验室 来源:中国IT实验室 2007年9月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)

键盘缓冲

    
搜集玩家输入信息是一个很重要的内容,我们知道J2ME中可以在keyPressedkeyReleased事件中处理按键内容,但这样势必将逻辑代码分散与gameLoopkeyPressed中。如果你说将所有逻辑代码放在keyPressed中,那可不行,因为keyPressed只有在按键的时候才产生,而即使没有按键游戏也有很多逻辑运算要做。所以专业游戏开发中采用键盘缓冲将按键信息存起来,然后在gameLoop中就可以判断这一帧按键的状态,利用按键缓冲,除了可以判断一个键是否按下松开,还可以判断一个键是否一直被按住了,甚至可以判断组合键。不过在这里,我只介绍一种最简单的按键缓冲。由于篇幅所限,只讲述原理并不给出具体代码。

    首先我们需要一个数据结构存储按键信息。你可以为每个键用一个bool值存储它的状态,不过专业一点的做法是用一个位表示一个键的状态,一个int32个位,足够表示大多数手机的所有按键了。因为我们要判断键是否按下或松开,为了方便,我们再用2个整数记录这两种状态。所以现在我们一共有三个int:

static int key , pressedKey, releasedKey ; 

      OK! 有了存储的地方,我们还需要一些常量表示每个位,我们设定key中某个位为0表示某键没有按下,为1表示按下。如果用第1位表示0键,第2位表示1键,那么可以这样设置常量:

final static int GKEY_0=1<<0, GKEY_1=1<<1 ; 

   明白了吗?这些常量是用来指定某个位用的,比如GKEY_1其实就是第21其它位均为0的一个整数。如果还不明白,先看下面的。

keyPressedkeyReleased里将分别将按下的键和松开的键进行记录。

 public void keyPressed(int keyCode)

            {             

                        int value = getKeyValue(keyCode) ;

                        key |= value ;

                        pressedKey |= value ;

            }

 

            public void keyReleased(int keyCode)

            {             

                        int value = getKeyValue(keyCode) ;

                        key ^= value ;

                        releasedKey |= value ;

            } 

    在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变量记录他们,分别是frameKeyframePressedKeyframeReleasedKeyacquireKey所做的就是将按键状态记录在这3个变量中,其实framePressedKeyframeReleasedKey不是必须的,只是这样看上去比较清楚。记录完后我们将pressedKeyreleasedKey清空,以便下次有键按下或松开时记录新的信息。关键的三个函数登场了,keyDown判断某个键是否在这一帧里被按下,参数gameKey是我们定义的按键常量中的某个值。如果对位运算还算明白的话,很容易看懂这3个函数。唯一要说明的就是keyHoldkeyDown的区别,keyHold表示某个键一直被按着,也就是至少从前一帧开始它就被按下了,而不是在这一帧里被按下的。现在你应该明白我们为什么要清空pressedKeyreleasedKey了。

    说到这里也差不多了,有了这个按键缓冲我们就可以在gameLoop中调用keyDown等方法判断按键的状态了。不过我还是要说一句,这只是最简单的按键缓冲,只能缓冲一次按键,如果一个键被多次按下就不行啦。更专业的内容需要你在实际工作中探索。

 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章