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

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

《超级玛丽》2

时间: 2024-10-07 09:43:41

《超级玛丽》2的相关文章

《大话操作系统——做坚实的工程实践派》(2)

 <大话操作系统--做坚实的工程实践派>(2)

《大话操作系统——做坚实的工程实践派》(硬件篇)

 很多朋友需要PDF,经过这几天的辛苦校对,当然目前只校对了一部分,那就先发这一部分的PDF PDF:<大话操作系统--做坚实的工程实践派>(硬件篇)下面是一部分PDF的截图,可以先预览一下

《大话操作系统——做坚实的工程实践派》(5)

有人说我不是只会玩X86吗?我现在铁板钉钉的申明:我其实兼通:ARM.IA-32.IA-32e.AMD64, ?了解MIPS,但没做过MIPS因为确实没有相应的MIPS硬件平台. ?

《大话操作系统——做坚实的工程实践派》(9)

20年前,对操作系统来说,虚拟内存是个高大上的玩意,它不仅仅是具备内存保护的功能,也给应用程序的独立开发带来了方便 ,其实它的底层逻辑是一个叫MMU的东西完成了一些重要的工作--

《大话操作系统——做坚实的工程实践派》(4)

 操作系统内核必须要关注一个具体硬件平台的设备

《大话操作系统——做坚实的工程实践派》(6)

 继续写硬件体系,这个不写完,不会写操作系统内核,因为根基不正,则难于达到上层境界.

《大话操作系统——做坚实的工程实践派》(1)

1《大话操作系统——做坚实的工程实践派》(8.1)(指令集未完待续)

大多数情况,操作系统内核用纯C语言是写不了的,因为有些关键功能,重要代码段,还是得用汇编指令干上一把才行, 本书不会过于详细的介绍ARM920T处理器所有的指令以及每条指令所有的详细使用方式.因为,一.篇幅所限,二.本书不是介绍某一特定处理器的指令集的专著.但是也不用害怕,笔者会尽量做到写操作系统内核时足够使用.

《大话操作系统——做坚实的工程实践派》(7)

 写操作系统内核需要了解一个具体计算平台的CPU,包括这个CPU里的寄存器和异常中断处理机制

《大话操作系统——做坚实的project实践派》(2)

?? ?<大话操作系统--做坚实的project实践派>(2)? 原文地址:https://www.cnblogs.com/llguanli/p/8451832.html