首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

Defender Game 游戏实践(一) 基本游戏场景实现

2013-10-08 
Defender Game 游戏实践(1) 基本游戏场景实现在网上看到 郑州|boy 这个博客,里面有几篇文章,记录了其用coc

Defender Game 游戏实践(1) 基本游戏场景实现

    在网上看到 郑州|boy 这个博客,里面有几篇文章,记录了其用cocos2d-x这个游戏引擎编写的一个游戏,十分不错,所以这段时间,依样画葫芦,依次学习一下。

由于博主开发的平台是在win32,而且屏幕分辨率也是800*480。我的目标是:按照博主的代码思路,将这个游戏在iphone这个平台下进行代码重构,其中在学习的过程中也进行一定的修改。

我的开发环境:xcode4.6.3 ; cocos2d-x 2.1.4。

本人会根据博主的介绍,加之理解,在代码编写的过程中,写几篇博文记录一下学习历程,以飨读者,也欢迎读者指责。

下面再次注明:博文中介绍到的游戏是通过  点击打开链接  得到,尊重原著。


下面第一篇介绍的内容是博主 系列介绍文章的(一)到(四)篇的内容。本人根据在学习过程中的一些历程分点记录。


资源下载:  项目程序下载(1~4)    注意:其中的资源已是最终版所需要的全部资源,所以在以后的新建文件中只需在代码中直接使用即可,不用再添加资源了。


一、BaseLayer层基类

作者在这个项目中使用到一个BaseLayer层基类,这个类基础自CCLayer,其中只是实现了几个层类中常用的方法。以后层类都是继承自这个BaseLayer类。


关于在游戏开始就进行游戏资源的预加载是一般游戏的通常做法,这样可以优化游戏的速度。通常加载的大部分内容都是图片资源,下面介绍一下这里加载图片资源的方法:

这里加载图片使用到的是 addImageAsync 方法,异步将图片资源加载进  CCTextureCache  中,加载完毕后,调用回调方法,通知进度条向前显示。

例如:



这个场景中主要处理的内容是背景音乐的播放和暂停;至于开始按键和开发者按键则是处理简单的视图跳转,比较简单。

首先,我们得知道游戏中背景音乐播放和禁止的逻辑。

1、采用 CCUserDefault 持久化保存用户对背景音乐播放与否的设置;

2、使用 CCMenuItemToggle 开关控件处理背景音乐播放和禁止的选择;

在创建背景音乐开关控件CCMenuItemToggle的时候要读取CCUserDefault中保存的值,根据true或者false进行不同的处理 。

关键代码如下:



这个场景十分简单,没有什么好说的。

不过,这里就讲一下作者在编写这个项目过程中编码的一个习惯吧!作者喜欢将问题细化成一个个模块,然后分别用一个个方法解决实现。我们一这个AboutCoderLayer类为例,在init方法中出现了一个 setUpdateView 方法,在这个方法中处理一些初始化的内容。(这样的处理相信读者已经在代码中已经见到过了。)个人觉得这种处理不错,分模块实现层次感好,而且在debug中也比较方便。

--------------------------------------------/   分割线   /-------------------------------------------------------------

前面的介绍相信都是很小儿科吧!下面开始进入游戏界面,也就是在welcome欢迎场景中点击开始进入的场景。


六、制作武器系统

Defender Game 游戏实践(一) 基本游戏场景实现


在上面大家已经看到我们的武器系统了,一把弓里面装了一些弓箭,它可以旋转调整角度,然后发射。

实现这样的一个武器系统要用到两个类:BulletSprite 和 WeaponSprite,第一个类就是处理弓箭的(武器系统中的主角),第二个类就是处理整个武器系统的。

(1)、关于BulletSprite 弓箭类,这个类继承 CCSprite。

1、BulletSprite的静态创建方法,显然我们自定义一个精灵类,自然也要实现其创建方法。不过我们可以参考CCSprite中的方法,依样画葫芦来实现。我们可以在CCSprite类中看到:

pweapon->initIdleBulletSpool(this);

2、initIdleBulletSpool  这个方法初始化了50支弓箭(包括弓箭的一些属性设置)供发射使用,初始化后,

this->schedule(schedule_selector(WeaponSprite::loade),1); 表示接着初始化武器系统上的5个弓箭,而且弓箭加载的时间间隔是1秒,那么当连续发射弓箭时,弓箭发射的时间至少也是1秒(这里的至少,后面会解释)。

3、在loade方法中实际调用的是 loadedBullet 方法,这里就是处理将5支弓箭添加到武器上。

3.1  要往武器上添加弓箭首先肯定是要获取到弓箭啦,getIdleBullet 这个方法就是用于获取弓箭的。这个方法是比较重要的,代码中我已经添加了注释。

在作者提供的代码中个人发现了一个问题:

for(int i=0;i<this->loadedArray->count();i++){this->loadedArray->removeObjectAtIndex(0);i--;}

咋一看,还不是很明白是神马意思!其实就是要清除loadeArray这一个数组中的所有内容。其完全等价于:this->loadedArray->removeAllObjects();

4、还有一个重要的方法是:



怪兽系统可以产生怪兽(赌徒),这些怪兽头顶有一个血条,这些怪兽从右往左走,收到弓箭弓箭后,血条会减少,直到死亡。怪兽可以执行奔跑动画,攻击动画和死亡动画。

这部分内容的实现包括两个类: MonsterSprite 和 MonsterSystem 。

(1)MonsterSprite 怪兽类,这个类继承CCSprite。其实很类似前面的弓箭类。具体就不介绍了,看看下面的类头文件估计就知道是什么内容了。

class MonsterSystem;


(2)MonsterSystem 怪兽系统类。

这个类主要就是根据MonsterSprite 怪兽类产生怪兽添加到游戏界面中。

,检测是否和怪物发生碰撞,如果发射碰撞,就是说怪兽被打中了,那么就要对怪兽头上的血条进行掉血的处理,调用的方法是怪兽类的 fallBlood 方法。


Defender Game 游戏实践(一) 基本游戏场景实现

热点排行