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

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

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

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

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

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

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

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

如果当前状态和参数传进来的状态是一致的,就直接返回,如果不一致,说明马里奥状态有改变了,然后停止马里奥所有的动作,根据新状态进行匹配和更新。

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

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
超级玛丽游戏GUL 设计软件源码+WORD毕业论文文档。 超级玛丽小游戏的JAVA程序,进入游戏后首先按空格键开始,利用方向键来控制的马里奥的移动,同时检测马里奥与场景中的障碍物和敌人的碰撞,并判断马里奥的可移动性和马里奥的生命值。当马里奥通过最后一个场景后游戏结束。。 本系统拥有的角色如下: (1)马里奥 (2)障碍物 (3)敌人 目 录 1、绪论 11 1.1背景以及现状 11 1.2 Java语言的特点 12 1.3 系统运行环境及开发软件: 12 1.4 可行性的分析 13 1.4.1 技术可行性 13 1.4.2 经济可行性 13 1.4.3 操作可行性 14 2、 需求分析 14 2.1 用户需求分析 14 2.2功能需求分析 15 2.3界面设计需求分析 15 3、 系统概要设计 16 3.1系统模块设计 16 3.1.1窗体类 16 3.1.2初始化类 17 3.1.3背景类 18 3.1.4马里奥类 18 3.1.5障碍物类 19 3.1.6敌人类 19 3.2系统流程设计 20 4、 系统详细设计 21 4.1 设计目标 21 4.2 系统模块设计 22 4.2.1窗体类 22 4.2.2初始化类 26 4.2.3背景类 28 4.2.4马里奥类 31 4.2.5障碍物类 37 4.2.6敌人类 39 5、系统的实现 42 5.1游戏开发所需要的图片 42 5.1.1马里奥的所有图片 42 5.1.2游戏中障碍物的图片 43 5.1.3游戏中怪物的图片 44 5.1.4游戏中的背景图片 44 5.1.5游戏开始时的图片 45 5.2游戏设计的界面 45 5.2.1 游戏逻辑展示 45 5.2.1 游戏逻辑展示 46 6、系统测试 48 6.1 测试的意义 48 6.2 测试过程 49 6.3 测试结果 49 7、总结与展望 50 7.1 总结 50 7.2 设计中的不足之处 51 7.3 展望 51 致 谢 52 外文原文 53 外文翻译 57 1、绪论 1.1背景以及现状 随着计算机日益普及,计算机已然成为人们日常生活的一部分的今天,计算机游戏也越来越成为人们生活中不可或缺的元素。游戏可以简单地理解为调节人们生活节奏和缓解人们生活压力的一种手段。现在理解的游戏基本意义都是娱乐性质较浓,要有特定的行为模式,遵循一定规则以达到游戏者目的的行动。游戏的最初目的就是让游戏者(玩家)在游戏中得到放松。游戏一直存在于人类活动中,如今定义的游戏从早期的猜谜游戏,发展到如今的单机RPG游戏,网络游戏等,已经升华为更高级别意义上的娱乐活动,对人们的感官刺激也越发强烈,得到的乐趣也更多。Java并不是以游戏编程为目的而被开发的,事实上,游戏编程可能是Java创造者心中的最后一个目标。在过去,妨碍Java发展的是它的运行环境;浏览器和Java类库一起从本质上决定了Java应该用来写哪种类型的应用程序,而高速的游戏和图象则不在其中。这给Java带来了不好的影响,因为人们注意的不是语言,而是它的运行环境。现在,浏览器已经不能控制一切了,Java作为游戏编程语言的另一个机会到来了。Java在过去有一点超前于它的时代,当时市场的动力落后于Java,但是现在Java可以而且已经取得成功。 1.2 Java语言的特点 1. 平台无关性 Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关。 2. 安全性 Java的编程类似C++,但舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器,防止程序的非法访问。 3. 面向对象 Java吸收了C++面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。 4. 分布式 Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的库函数,使用其相关技术可以十分方便的构建分布式应用系统。 5. 健壮性 Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。 1.3 系统运行环境及开发软件: 开发环境:Windows 7; (2)开发工具:eclipse; (3)编程语言:Java语言; 1.4 可行性的分析 可行性研究的目的,就是用最小的代
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值