第二阶段:
目标:让马里奥接受左右移动控制和跳跃控制,以及在这个过程中执行左右行走动画和维持腾空状态,还有马里奥状态机的设计。这个过程中也没有碰撞检测。
1:这是一个横版卷轴控制动作类游戏,虽说用鼠标点击模拟的移动设备上的触摸机制,但还是不方便测试,比如同时按下两个按键时,单用鼠标触摸就做不到了。所以为了实现开发初期的测试便利,需要把引擎稍加改造一下,让游戏接受来自键盘的消息并响应。这一点并不难做,这里的链接说的很清楚,照着做就OK了。【http://blog.csdn.net/a7833756/article/details/7772115】
CCGameLayer:: voidprocessWin32KeyPress(UINT message, WPARAM wParam, LPARAM lParam);这个方法可以扑捉到来自键盘的消息并且在函数内可以对不同的按键做处理,这一点和win32编程一致。
2:游戏中没有使用仿真物理环境,里面的左右移动和跳跃是通过参数值的改变实现的。CCGameLayer类里面关于左右移动的变量有2个,float ccMoveOffset;是在构造函数里初始化好的固定值,float moveOffset;是对方便统一对外更新,在游戏过程中如果按下了左键那么moveOffset就会被附上 –ccMoveOffset,如果按下来右键那moveOffset就会被附上ccMoveOffset。
这样也是为了后面的修改方便,假如到处写的都是数字,修改起来也麻烦,这样子如果要修改的话只需要修改ccMoveOffset的值就可以了。
3:下面介绍一下游戏中马里奥左右行走和跳跃的核心思路。在CCGameLayer类的update(floatdt);,这是一个控制马里奥更新的函数,这个函数的核心代码截图:
这个函数每一帧都会执行一次,CCGameLayer类里还维护了两个bool值,标志着是否按下了左或是右。
这四个按键是通过UI控制手柄上的四个按钮控制的,当左键被按下时,isLeftKeyDown为真,将moveOffset设置为-ccMoveOffset。当右键被按下时,同理。
4:让马里奥在左右移动的过程中执行行走的动画。这一点需要谈到cocos2dx关于动画的部分,这里用到的是帧动画,意思就是一张一张的大小一致的图片,制作成一个动画,并存储到引擎自带的动画缓存里。这里面关于动画的制作,存储以及调用都是在AnimationManager类里面:
这是一个单例,单例是常见的一种设计模式,原则上游戏运行起来,只需要一个对象的类都可以设计成单例。引擎中也有很多的类设计成了单例,比如导演类CCDirector,还有各种缓存类CCTextureCache,CCAnimationCache等等。在马里奥类中是通过枚举来调用动画的。在GameEnum.h文件中:
这个文件里包含了游戏中要用到的所有枚举,比如游戏中的动画,怪物的种类,地图上的各种碰撞检测元素等等。 在上一段的基础上,当按下左键时,同时马里奥播放向左行走的动画,最后把动画的播放间隔和移动的速度进行调整,看起来更自然,这里面涉及的数值并没有直接写在代码里,而是通过参数的形式,便于调试和修改。
5:跳跃的实现。这一点和前面的左右行走是一个概念,不同的是,跳跃不需要维护一个bool值,当跳跃按键被按下时,腾空的姿态,并且马里奥的纹理也换成腾空图片。这里面涉及到一个马里奥是否在空中的bool标识,因为当马里奥腾空后跳跃按键就不能无效了,只有当马里奥在地面上或是在地图的砖块物上时,才可以响应跳跃按键。当马里奥落到地面上后,马里奥的纹理根据当前马里奥的朝向来选择,因为马里奥在空中是接受左右按键响应的,所以当马里奥向右跳跃后,突然按下左键,马里奥的转向会改变。在这里怎么确定马里奥的是否腾空状态,就涉及到竖直方向上的碰撞检测了,就是和地面和地图上的某些可站立砖块做碰撞检测。下面是跳跃按键被按下后的逻辑
在CCGameLayer::collistionV()函数中的最后一行:
这样就能够达到一个马里奥向上跳跃过程中的逐渐减速效果,直到jumpOffset减到0,这时马里奥也到达了跳跃的最高,持续执行上面的减法,马里奥又会落到地面上,执行的逻辑如下:
6:马里奥状态机的维护。整个马里奥在游戏中的表现就是一部状态机在任意的切换。怎么细化马里奥在游戏中的状态呢?一个方面是从马里奥的体型,这个体型指的是吃蘑菇前的和吃蘑菇后的,以及吃到子弹的;一个方面是从马里奥的运动状态,比如站立的左和右,行走的左和右,以及腾空的左和右。在马里奥的状态机里面所有的逻辑就是这么处理的,组后要提到的一点是,马里奥的状态也是每一帧都要设置的,这样子就会带来一个问题,如果当前和上一帧的状态是一样的就没必要更新马里奥的状态,这时候就引入了一个当前状态和前一个状态,状态机函数最开始有一个判断:
如果当前状态和参数传进来的状态是一致的,就直接返回,如果不一致,说明马里奥状态有改变了,然后停止马里奥所有的动作,根据新状态进行匹配和更新。
7:控制手柄的实现,这个没什么技术难度,也不难理解。就是响应win32的键盘消息,根据消息设置马里奥的控制变量。
8:地图的跟随实现以及马里奥不能往回走的实现。这个可能是一个难以理解的地方,网络上也有很多在问这个问题,在解决这个问题之前首先要深刻理解锚点概念,以及局部坐标系之间的关系,这两个不理解那本需求就很难实现。
总结:这一阶段的成果:马里奥能接受来自键盘的消息并做出处理,马里奥在地图上行走自如,并且有真是的行走动画,可以跳跃,可以落地,可以跳到地图上的某些砖块上,如图: