《超级玛丽》2



第二阶段:

目标:让马里奥接受左右移动控制和跳跃控制,以及在这个过程中运行左右行走动画和维持腾空状态,还有马里奥状态机的设计。这个过程中也没有碰撞检測。

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控制手柄上的四个button控制的,当左键被按下时,isLeftKeyDown为真,将moveOffset设置为-ccMoveOffset。当右键被按下时,同理。

4:让马里奥在左右移动的过程中运行行走的动画。这一点须要谈到cocos2dx关于动画的部分,这里用到的是帧动画,意思就是一张一张的大小一致的图片,制作成一个动画,并存储到引擎自带的动画缓存里。这里面关于动画的制作,存储以及调用都是在AnimationManager类里面:

这是一个单例,单例是常见的一种设计模式,原则上游戏执行起来,仅仅须要一个对象的类都能够设计成单例。引擎中也有非常多的类设计成了单例,比方导演类CCDirector,还有各种缓存类CCTextureCache,CCAnimationCache等等。在马里奥类中是通过枚举来调用动画的。在GameEnum.h文件里:

这个文件中包括了游戏中要用到的全部枚举,比方游戏中的动画,怪物的种类,地图上的各种碰撞检測元素等等。 在上一段的基础上,当按下左键时,同一时候马里奥播放向左行走的动画,最后把动画的播放间隔和移动的速度进行调整,看起来更自然,这里面涉及的数值并没有直接写在代码里,而是通过參数的形式,便于调试和改动。

5:跳跃的实现。这一点和前面的左右行走是一个概念,不同的是,跳跃不须要维护一个bool值,当跳跃按键被按下时,腾空的姿态,而且马里奥的纹理也换成腾空图片。这里面涉及到一个马里奥是否在空中的bool标识,由于当马里奥腾空后跳跃按键就不能无效了,仅仅有当马里奥在地面上或是在地图的砖块物上时,才干够响应跳跃按键。当马里奥落到地面上后,马里奥的纹理依据当前马里奥的朝向来选择,由于马里奥在空中是接受左右按键响应的,所以当马里奥向右跳跃后,突然按下左键,马里奥的转向会改变。在这里怎么确定马里奥的是否腾空状态,就涉及到竖直方向上的碰撞检測了,就是和地面和地图上的某些可站立砖块做碰撞检測。以下是跳跃按键被按下后的逻辑

CCGameLayer::collistionV()函数中的最后一行:

这样就行达到一个马里奥向上跳跃过程中的逐渐减速效果,直到jumpOffset减到0,这时马里奥也到达了跳跃的最高,持续运行上面的减法,马里奥又会落到地面上,运行的逻辑例如以下:

6:马里奥状态机的维护。整个马里奥在游戏中的表现就是一部状态机在随意的切换。怎么细化马里奥在游戏中的状态呢?一个方面是从马里奥的体型,这个体型指的是吃蘑菇前的和吃蘑菇后的,以及吃到子弹的;一个方面是从马里奥的运动状态,比方站立的左和右,行走的左和右,以及腾空的左和右。在马里奥的状态机里面全部的逻辑就是这么处理的,组后要提到的一点是,马里奥的状态也是每一帧都要设置的,这样子就会带来一个问题,假设当前和上一帧的状态是一样的就不是必需更新马里奥的状态,这时候就引入了一个当前状态和前一个状态,状态机函数最開始有一个推断:

假设当前状态和參数传进来的状态是一致的,就直接返回,假设不一致,说明马里奥状态有改变了,然后停止马里奥全部的动作,依据新状态进行匹配和更新。

7:控制手柄的实现,这个没什么技术难度,也不难理解。就是响应win32的键盘消息,依据消息设置马里奥的控制变量。

8:地图的尾随实现以及马里奥不能往回走的实现。这个可能是一个难以理解的地方,网络上也有非常多在问这个问题,在解决问题之前首先要深刻理解锚点概念,以及局部坐标系之间的关系,这两个不理解那本需求就非常难实现。

总结:这一阶段的成果:马里奥能接受来自键盘的消息并做出处理,马里奥在地图上行走自如,而且有真是的行走动画,能够跳跃,能够落地,能够跳到地图上的某些砖块上,如图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值