Cocos2d-X

2024-08-20

Cocos2d-X(精选4篇)

Cocos2d-X 篇1

1 开发背景及意义

休闲娱乐已经成为我们这个时代很重要的一部分, 随着科技的发展, 生活节奏的加快, 人们空余时间越来越少, 娱乐时间也更加不足, 利用零碎时间进行娱乐的方式已成为众人所盼。随着手机的日益普及, 游戏功能在移动设备上的实现, 特别是手机性能逐渐增强, 手机作为一个游戏平台变得越来越成熟, 作为移动设备开发技术cocos2d-x因其跨平台性而越来越受重视, 一款跨平台、玩法简单易懂, 趣味性强, 让人们只利用零碎时间即可达到娱乐放松的小游戏更受众人青睐。

2 分析与设计

2.1 性能需求

本项目———迷宫探险小游戏, 允许用户通过多种平台 (PC端、移动终端等) 进行操作, 游戏通过限定关卡时间, 来控制玩家游戏的输赢;通过在迷宫中安置怪物和物品, 来增加玩家的战斗成就感;通过设置不同的关卡难度, 让玩家充分体验挑战性。

2.2 功能需求

通过查看帮助菜单可以了解游戏玩法, 选择关卡菜单即可进入相应关卡场景探险;点击关卡场景的返回按钮可以返回菜单界面.对玩家来说, 本游戏具有很大的自由性, 可供玩家随时随地进行娱乐, 趣味性强, 实用性高。

1) 界面。本游戏界面简单却不单调, 菜单界面采用图片菜单, 菜单功能一目了然;游戏界面双色隔开, 形成迷宫, 在迷宫上放置怪物和物品, 游戏元素丰富。2) 在游戏主界面底端显示已经进行游戏的时间、剩余游戏时间和当前生命值, 玩家通过查看时间和生命值信息可调整战斗状态, 以便成功历险。3) 特效、背景音乐、音效。本游戏设置了战斗动画、拾取物品特效等功能, 播放背景音乐、战斗和拾取物品音效功能, 游戏综合了视觉、听觉、触摸等效果, 让玩家充分体验身临其境的感觉。

3 游戏设计与实现

3.1 游戏规则设计

本游戏是一个益智类迷宫探险游戏, 分为9个关卡, 每个关卡设置不同难度。在迷宫地图中增加怪物和物品, 用来增加迷宫探险的趣味性。

1) 地图大小设定。本游戏把9个关卡地图设置成3种不同大小的地图, 其中, 地图大小是只在tiled地图编辑器的图块数, 每个图块是32×32像素。把地图分成三类, 从地图大小上把关卡难度划分成三个等级, 减轻地图制作的繁杂和工作量, 却不显单调。2) 关卡时间设定。玩家在限定的关卡时间内还没到达出口处, 则探险失败, 切换到探险失败场景, 并显示失败原因和剩余生命值。在限定的关卡时间内到达出口, 则探险成功, 切换到通关场景, 显示剩余生命值、所消耗时间和评价等级, 其所耗时间越少, 评价越高。3) 英雄生命值设定。由于游戏的地图大小不同, 怪物、物品排布不同, 因此各关卡英雄的初始生命值也应该不同。为遵守随关卡数难度系数递增规则, 在充分考虑物品、怪物排布、地图大小等。4) 怪物生命值设定。为丰富本游戏, 添加了四种不同怪物, 用于阻碍英雄前进.四种怪物有不同的形象, 并有不同的生命值, 游戏过程中, 英雄遇到怪物会消耗与该怪物相等生命值去消灭怪物, 若英雄生命值消耗完, 则探险失败, 切换到失败场景, 场景显示失败原因和剩余时间。战斗过程会消耗一定时间, 同时播放战斗动画和战斗音效, 给人增加一种身临其境的感觉。5) 物品补充生命值设定。为了补充英雄的生命值, 使英雄能够维持足够的生命值杀怪通关, 本游戏设置了四种物品给英雄补充生命值。四种物品有不同的形象, 并能补充不同的生命值, 游戏过程中, 英雄遇到物品会拾取该物品为自己补充生命值, 拾取过程会播放拾取物品音效、英雄身上发出粒子特效, 给人增加成就感。获得物品后在游戏场景下方刷新英雄当前生命值。

3.2 游戏总规则设定

本游戏是跨平台游戏, 以走迷宫为主、杀怪捡物品为辅, 支持pc机的键盘方向移动英雄, 也支持手机的触屏移动英雄。每个关卡迷宫都有一个入口和一个出口。进入关卡地图时, 英雄默认在入口处。当有触屏 (或键盘方向操作) 事件时, 游戏会根据方向进行碰撞检测, 若该方向是墙壁, 只是调整怪物方向, 不移动;若是怪物, 则触发战斗, 消耗英雄生命值;若是物品, 则拾取物品, 给英雄补充生命值;若是通道, 英雄则可前进;若是出口, 则探险过关, 根据探险时间确定关卡评价等级。若英雄在还没到达出口处之前, 时间结束或者生命值消耗完, 探险失败。

4 界面设计

本游戏是基于cocos2d-x技术开发的工程。根据迷宫探险的需求分析一级cocos2d-x框架的特点, 本系统设计了六个主要场景管理游戏:主菜单场景、游戏场景、小助手场景、关于场景、探险成功场景、探险失败场景。如下图所示:

5 总结

本设计重点解决了以下5个方面:1) 地图设计:利用tiled地图编辑器编辑地图, 进行图层设计, 主要包括迷宫设计、物品、怪物摆放, 以及关卡相关数据设定;2) 英雄行走:获取用户触屏事件, 实现根据触摸坐标确定英雄行走方向的逻辑, 若是键盘事件, 则捕捉键盘信息, 确定英雄移动方向, 下一步进入移动处理逻辑;3) 碰撞检测:程序根据英雄行走方向, 获取该方向的地图图层信息, 判断图层信息 (包括墙壁、边界、怪四种物、四种物品、出口等) 进行相应处理;4) 动画生成与播放:游戏利用纹理图来制作多种动画, 包括英雄行走、战斗、怪物受到打击、拾取物品特效等动画;5) 音乐、音效:游戏选取了合适的主音乐背景、关卡音乐背景、战斗音效、拾取物品音效, 根据游戏场景控制音乐音效的播放和停止。

参考文献

[1]满硕泉.Cocos2D-x权威指南[M].北京:机械工业出版社, 2013.

[2]李华明.i OS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发[M].北京:清华大学出版社, 2013.

Cocos2d-X 篇2

塔防, 即炮塔防御 (Tower Defence) 的简称。炮塔防御游戏起源于最早的一款Desktop Tower Defence游戏。现在除了单纯的建造炮塔防御怪物, 更产生了像《植物大战僵尸》这样的新型衍生类塔防游戏[1]。

塔防游戏模式简单, 可玩性强, 而且乐趣无穷、经久不衰。而Cocos2D-X是一款支持多平台的2D手机游戏引擎, 自2010年推出后受到越来越多游戏开发者的青睐。

本文基于Cocos2D-X游戏引擎, 开发出一款新型的塔防游戏。此游戏设置多种人类精灵供玩家选择, 玩家通过摆放人物精灵来防御怪物精灵的进攻, 当怪物精灵被消灭殆尽时, 玩家便取得胜利。

1 游戏设计

1.1 游戏构思

游戏的构思来自《植物大战僵尸》, 游戏中众多人类精灵参考《植物大战僵尸》里面的植物, 但所展示的形象大不相同[2]。游戏是在一个虚构的时代背景下, 人类受到魔界的入侵, 人类举行一个召唤仪式来唤醒人类的守护神, 而魔界则源源不断地派出魔界精灵来阻止仪式的进行, 人类奋力防止魔界精灵进入召唤仪式的范围, 游戏精灵采用人型形象。

除了形象的改变以外, 游戏还加入了怪物头领。每一个大关卡结束后, 玩家都需要战胜一个怪物头领才能开启下一个大关卡。在对战怪物头领过程中, 怪物头领会不停召唤在当次大关卡出现过的魔界精灵来协助。

1.2 设计原则

为了使本游戏趣味丰富、操作简单, 最大限度地提高游戏质量, 让用户体验到游戏的乐趣, 在设计开发过程中遵循如下原则:

(1) 合理性原则。游戏中精灵间的相互作用合理, 如不会出现血量为零时, 精灵依然存活。

(2) 准确性原则。精灵根据种类分为海、陆和空3种, 攻击种类亦作出了同样的区分, 以保证游戏中不会出现陆地精灵攻击空中精灵等情况。

(3) 趣味性原则。参考流行的塔防游戏, 加入了新的元素。

(4) 易操作原则。要求设计的游戏界面友好, 拖放精灵简便, 并在必要的地方加以提示。

(5) 可读性原则。为了便于以后游戏升级维护, 按模块进行了详细的代码注释。

1.3 游戏模块设计

本游戏模块结构层次如图1所示。

2 游戏实现

2.1 战场实现

2.1.1 地图模块

游戏设计类似与《植物大战僵尸》, 在游戏战场的基础上引入了地图[3]。地图的主要作用是:

(1) 确定战场基本单位。精灵位置以格子为基本单位摆放, 一个格子内同一时间只允许摆放一个人族精灵。

(2) 确定战场地形。游戏地形分为陆地与水面, 地形对精灵的摆放规则起到决定性作用, 如水上的精灵绝对不能摆放在陆地上。

在确立精灵的摆放规则后, 采用Box2D物理引擎所提供的AABB动态检测树算法, 实现精灵间的相互检测。在精灵间相互过滤, 采用位的“与”运算来实现。在精灵相互检测时, 会比较它们的类型与眼睛类型, 仅当眼睛类型与被检测目标的类型相“与”后, 结果大于1时, 目标才会检测到, 例如:

精灵A的类型是1, 眼睛类型是2, 二进制码分别是01和10;而精灵B的类型是2, 眼睛类型同样是2, 二进制码则都是10。那么在检测后, 精灵A能够检测到精灵B, 而精灵B却检测不到精灵A。

2.1.2 精灵回收模块

在游戏过程中, 由于游戏精灵不停地创建和消灭, 为了避免频繁地申请内存, 游戏引入了精灵回收机制[4]。每个精灵被创建并加入战场后都会成为战场的子节点, 被战场模块所管理。当精灵被消灭后, 该精灵会脱离战场模块的管理, 加入到精灵回收模块。在游戏需要继续创建该种类精灵时, 系统不会直接创建, 而是会向精灵回收模块申请得到该种类精灵的控制权;精灵回收模块会在所管理的精灵中寻找出符合该种类的精灵, 并返回, 如果找不到, 精灵回收模块则会创建该种类精灵, 流程如图2所示。

2.2 精灵实现

游戏精灵在创建并加入战场后, 一切行为都是自发性的, 玩家并不能进行干预和控制, 而只能把精灵销毁以回收资源。而精灵的自主性就需要依靠行为树去完成[5]。行为树的节点与作用如表1所示[6]。

游戏精灵主要分大脑、眼睛、攻击、移动和摆放5个模块。

2.2.1 大脑模块

大脑, 顾名思义, 就是精灵行为的控制系统, 负责攻击模块的开启, 同时负责精灵自身的死亡检测, 以便进行回收。大脑模块的行为树流程如图3所示。

2.2.2 眼睛模块

眼睛, 主要负责精灵对目标的检测, 根据自身设定的检测范围作为参数, 通过调用地图模块的查询函数得到该检测范围内的目标, 然后把目标传递给攻击模块。

2.2.3 攻击模块

由于精灵的攻击动画具有“前摇”动作, 在精灵播放攻击动画时, 并不会马上对被攻击目标产生伤害, 所以在攻击模块里需要把攻击动画的播放与攻击伤害的计算分开处理, 并且将两者同步。游戏会根据精灵的攻击动作时长与“前摇”动作时长进行记录, 并显示在精灵的配置文件里。在精灵进行攻击时, 根据“前摇”动作时长将伤害计算后延。攻击模块的行为树流程如图4所示。

2.2.4 移动模块

移动模块主要作用于怪物精灵, 因为玩家所摆放的精灵作为防守方是固定不动的, 而怪物精灵作为进攻方不停地移动以击溃玩家。

精灵的移动是利用Cocos2D-X引擎内部提供的setPosition函数来完成的。在精灵移动时, 精灵会播放移动动画, 同时不停地调整位置。

2.2.5 摆放模块

游戏中精灵被区分为陆地精灵和水上精灵, 精灵只能摆放在对应的地形上。由于设计的需求, 陆地精灵可以摆放在“木筏”上, 而“木筏”可以摆放在水面上, 换言之就是陆地精灵通过“木筏”可以摆放在水面上。

2.3 其它模块实现

2.3.1 精灵动画实现

精灵动画的类型属于关键帧动画, 由外部编辑器完成设计。动画利用了Cocos2D-X引擎的CCAction相关接口来实现关键帧间的补间动画, 如:CCMoveBy、CCRotateBy等。这样设计的好处是免除了引入外部动画模块所带来的耦合, 而且不需要干预到Cocos2D-X的渲染流水线, 提高了效率。

2.3.2 C++实现反射机制

由于语言限制, C++并没有实现类似Java的反射, 但游戏中需要通过配置文件实现游戏精灵的创建, 所以游戏里通过定义类的静态方式实现了C++简单的反射[7], 以下是实现过程与关键代码:

游戏精灵的实现类, 在定义时通过调用宏DEFIND_DYNAMIC_CLASS来定义一个静态方法, 该方法实现了该类对象的动态创建。在整个游戏运行时, 程序需要调用REG_DYNAMIC_CLASS来实现游戏精灵类的注册, 而类CCDynamicClassFactory则维护着所有精灵类的类名与静态方法的函数指针关系。

2.4 多平台移植与多分辨率适配

2.4.1 多平台移植

虽然Cocos2D-X引擎支持众多平台, 但根据市场占有率来考虑, 游戏只需要移植到IOS、Android、Windows Phone 8和Windows 8。由于Cocos2D-X引擎已经在底层根据平台的不同而做出了分支, 所以移植过程中并不会出现重大阻碍[8]。这里要注意下面两点:

(1) C++中野指针的问题。由于平台的区别, 类成员变量中的指针变量如果没有初始化, 那么该指针有可能是野指针或者是空指针, 结果就是在使用同样代码的情况下, 在一个平台上运行正常, 在另外一个平台上却出现崩溃。

(2) Android平台上资源的读取。Android资源读取时需要查找资源位置, 频繁的读取会导致游戏需要较长的时间才能加载完成, 解决的方法是把资源打包成MPQ格式, 这种格式广泛应用在暴雪游戏里。使用MPQ格式, 可以大大提升Android平台资源读取速度[9]。

2.4.2 多分辨率适配

本游戏的资源是在编辑器上完成组装和设计的, 在组装过程中已经根据分辨率大小作出了资源选择, 准则是“高分辨率使用HD高清图, 低分辨率使用SD标清图”。考虑到苹果Ipad的Retina分辨率, 会特别针对它做一个分辨率, 图片使用FHD全高清图。

游戏会根据需求, 做好特定的分辨率资源, 特别是苹果机器的分辨率。但在Android和Windows Phone 8下, 需要根据已有分辨率作适配。Cocos2D-X引擎已经为多分辨率适配做了大量工作, 所以并不需要开发者直接操作视口大小和触控的分发[10]。

值得关注的是Android平台上的多分辨率问题, 因为基于Android平台的手机众多, 只能通过现在的分辨率资源找到最接近的进行伸缩。本游戏采用的方案是寻找与目标分辨率像素总数差值最小的现有分辨率进行适配。

3 结语

本游戏基于2D游戏引擎Cocos2D-X, 采用C++语言与Lua语言进行了系统构建。游戏支持Android、IOS和Windows Phone 8等主流手机平台。游戏设计参考了热门的塔防游戏《植物大战僵尸》, 在风格上采用了被玩家广泛接受的Q版日系欧美风格, 在操作上允许玩家拖放摆放卡片或点击摆放卡片。游戏同时具备完善的教学提示, 能让玩家更好、更快地理解游戏、享受游戏。

参考文献

[1]塔防.百度百科[EB/OL].http://baike.baidu.com/view/2060968.htm, 2013-07-01.

[2]植物大战僵尸.百度百科[EB/OL].http://baike.baidu.com/view/2451591.htm, 2013-09-01.

[3]ZHE WANG.TileMap[EB/OL].http://www.cocos2d-x.org/projects/cocos2d-x/wiki/TileMap, 2013-04-01.

[4]THOMAS GEORGE.Object pooling for generic C++classes[EB/OL].http://www.codeproject.com/Articles/3968/ObjectPooling-for-Generic-C-classes, 2003-05-04.

[5]Behavior trees_wiki[EB/OL].http://en.wikipedia.org/wiki/Behavior_Trees, 2013-08-25

[6]愤怒的泡面.基于行为树与状态机的游戏人工智能[EB/OL].http://www.gameres.com/thread_182152_1_1.html, 2012-03-24

[7]NIGHSEN.在C++实现反射[BE.OL].http://blog.csdn.net/nighsen/article/details/6407017, 2011-05-09

[8]ZHE WANG.Cocos2d-X_reference[EB/OL].http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Reference, 2012

[9]维基百科.MPQ[EB/OL].http://en.wikipedia.org/wiki/MPQ, 2013.

Cocos2d-X 篇3

随着科技的发展,终端设备的种类和花样也越来越多,其中手机占了很大的份额。因此手机应用的设计与应用也随之发展,越来越多的计算机网络游戏开始流行。目前,安卓游戏市场已涌现出数万款手游,如:And Enginge,Rokon,Lgane,Cocos2d等,从而也涌现出一大批安卓游戏,开发引擎也随之发展起来。Cocos2d作为本游戏的开发引擎,它的优点在于采用的是开源协议BSD,网站提供大量的测试例子,编程指南,教学视频等,是当前最流行的一种开发引擎。

三消类游戏在国内外有着数百年的历史,是一款长期以来典型的休闲益智游戏之一,并受到玩家的广泛欢迎。预计在未来几年内,三消类游戏还会有着强大的吸引力。

1 系统需求

根据基于Android移动终端设备的应用软件的用户体验和个性化的特点,在本系统的需求分析阶段,采用原型模型法分析。

本游戏客户需求是设计并实现一款基于Android手机平台的2d游戏。本游戏为消除类游戏。即在规定的条件下,通过合成物品达到相关的关卡目标。根据客户提供的需求,对游戏进行了针对性的策划。游戏的用户需求对相对一般的系统来说是有较大的区别。对其他的系统来说是用户类型有多种,如一些管理系统就会分为普通用户和管理员。而就游戏来说用户是不存在太大区别的,如果一定要区分的话那只能在玩家的消费水平,玩家技术水平和玩家年龄等方面来分了。而本游戏是不进行这种分类的,本游戏的用户只有玩家。

目前玩家对于游戏的需求主要体现在挑战性,交流,成就,幻想,消遣休闲,故事体验,获得知识,收获快乐以及画面。所以想做出一款好游戏必须具有上述条件才行。

挑战性主要体现在游戏的难易上,要给玩家失败感,这样才可以达到真正的挑战满足感;交流是要求游戏具有一定的社交系统;成就需要更多方式的体现,如给玩家一些荣誉奖牌或称号;幻想就是要求游戏具有特色,创意,能让玩家投入更多的金钱和精力到游戏中;消遣休闲是游戏要具有一定的趣味性,能带给玩家快乐;故事体验也就是要求游戏内有一些剧情和背景故事;获得知识要求玩家可以通过游戏而学习到一定的知识,这个是不容易做到的;收获快乐是最主要的,如果游戏不能给人快乐那说明这款游戏是一款失败的作品;而画面上的需求也是一定的,不同玩家群体对游戏的风格要求不同,这就要求游戏策划对不同的玩家群体做出很好的判断,最好是提供给玩家一些选择。

2 游戏系统功能模块设计

本游戏最终确定分为七个功能模块,分别为主操作区模块,游戏设置模块,游戏好友模块,游戏地图模块,游戏奖励模块,游戏成就模块和游戏商城模块。系统的总体模块图如图一所示。

成就功能模块主要功能就是给玩家评定荣誉,玩家获得的成就越多,说明玩家的荣誉越高。这个模块主要是用于提高游戏的可玩性。游戏成就主要包括在分数上,合成物品上以及使用道具上的成就。当玩家达到了成就所需要的条件后玩家就可以获取相应的荣誉奖牌,系统会给玩家一些金币奖励,并提示玩家当前所获得的荣誉。

奖励功能在一款可持续更新的游戏中占有重要的地位,如果一款游戏没有奖励系统功能模块,在当下的游戏行业中是很难生存的,就像目前市场上的单机游戏一样。所以本游戏也加入了奖励功能模块。本系统的奖励功能模块主要包括每日登录奖励、过关奖励和达成成就奖励,另外还有一个隐藏的奖励就是抢宝关卡。每日登录奖励是玩家每天登录就可以领取一次的奖励,不需要消耗金币的体力就能领取,这是为了鼓励玩家每天进行游戏。过关奖励就是通过本关就会给玩家一些奖励,第一次过关的奖励要比重复过关的奖励高很多,同时高等级关卡也比低等级关卡的奖励高,这也是为了鼓励玩家去挑战高等级的关卡。成就作为游戏唯一荣誉模块当然也会有奖励的,每达到一个成就系统是会给出金币奖励的。同类成就的金牌成就一定会比铜牌成就的奖励丰厚。当玩家打开游戏进入游戏地图界面,如果未领取当日登录奖励的话,系统会自动弹出奖励界面。而过关和成就的奖励,系统会根据相关条件来判定,符合条件,系统将会自动发放奖励到玩家的账户上。

地图功能模块是目前游戏相对来说较为常用的选择关卡的表现形式,本游戏也是采用这种设计模式,地图模块对关卡设定了一些权限,未登录的玩家只能对游戏的前6关进行操作,而玩家发送的好友请求不足5条时是不能进入11关以后的操作的。

游戏设置模块基本上是所有游戏中都要有的一个功能,所以本游戏中也加入了这个功能,本游戏的游戏设置包括游戏的音效设置与背景音乐设置,而且只设计了声音的开关,并没有声音文件的选择功能。

主操作区是本游戏操作最核心的一个部分,操作区是6×6的方格,其中操作区左上角的一格用来作为物品寄存处,可以把暂时不用的物品存放在寄存处,但只能存放一个物品。若是格子中放了物品则不能再放入物品了,只有在消除该物品后才能再次放下物品。本关正常结束的判定是达到了过关要求或是把除寄存处外的35个格子放满。

3 数据库模块设计

系统的用户信息包括的属性有用户编号、用户昵称、用户体力、用户部分、用户状态、用户金币、用户是否拥有无限体力、用户信息更新时间和用户信息创建时间。用户好友信息包括的属性有用户编号、用户id、好友id和创建时间。用户好友互动信息包括的属性有用户编号、交互id、交互方式、体力信息、金币信息、更新时间和是否已读。用户好友申请信息包括的属性有用户编号、发送方id、接受方id、请求更新时间和申请时间。用户好友申请结果信息包括的属性有用户编号、申请发送方id、申请接收方id、申请处理结果和结果更新时间。用户好友互动统计信息包括的属性有用户id、用户偷取次数、用户赠送次数和更新时间。用户关卡信息包括的属性有用户编号、用户id、关卡编号、过关次数和更新时间。

4 结束语

本款游戏采用的是开源的Cocos2d-x游戏引擎,使用C++开发,基于Android 2.1及更高版本下运行。设计了手机游戏的基本操作,如达成成就,过关成功,领取奖励等。可以减缓人们的压力,使人们在业余时间能够放松心情,提高工作,学习效率。

参考文献

[1]房晓溪.C++手机动漫游戏设计教程(动漫游戏设计丛书)[M].北京:水利水电出版社,2008.

[2]高雷,陈博,傅曦.手机游戏开发精粹[M].北京:人民邮电出版社,2009.

[3]刘剑卓.Android手机游戏开发从入门到精通[M].北京:中国铁道出版社,2012.

[4]牛.基于ios的2D第三人称射击游戏引擎的研究与实现[D].苏州:苏州大学,2012.

[5]徐松林,黄猛.Cocos2d-x手机游戏开发:跨IOS、Android和沃Phone平台[M].北京:人民邮电出版社,2012.

[6]尹志宇,郭晴.数据库原理与应用教程:SQLServer[M].北京:清华大学出版社,2010.

[7]朱成亮.基于Android平台游戏引擎的设计与实现[D].合肥:安徽理工大学,2011.

Cocos2d-X 篇4

关键词:Cocos2d-x工程,射击类游戏,C++语言,XCode模板

1 安装和配置 Cocos2d-x 开发环境

为了满足还没有接触过Cocos2d-x的读者的要求, 在介绍Cocos2d-x开发之前, 先介绍一下Cocos2d-x的开发环境的配置。Cocos2d-x通常可以使用Visual Studio、Eclipse和XCode 3个开发工具来开发。其中Visual Studio相对较简单。因此主要介绍XCode (Mac OS X平台) 和Eclipse的安装和配置。

在Cocos2d-x 2.x开发包的根目录有一个install-templatesxcode.sh文件 (Shell脚本文件), 该文件用于安装XCode插件,该插件可以建立Cocos2d-x的一些列模板工程。直接在Console中执行该脚本文件即可。如果成功执行, 在XCode的新建工程窗口左侧的“iOS”节点下多了一个“Cocos2d-x”字节点。点击该字节点后, 会在右侧出现如图1所示的5个模板。这5个模板所建立Cocos2d-x工程的类型如下:

(1) Cocos2dx: 普通的Cocos2d-x工程。

(2) Cocos2dx-box2d: 使用box2d物理引擎的Cocos2d-x工程。

(3) Cocos2dx-chipmunk: 使用chipmunk物理引擎的Cocos2d-x工程。

(4) Cocos2dx_js: 基于Javascript的Cocos2d-x工程。

(5) Cocos2dx_lua: 基于Lua的Cocos2d-x工程。

使用Cocos2d-x 2.x开发基于iOS的游戏还是很容易的。可以选择XCode中的5个模板中的一个, 在这里使用第一个模板, 然后点击“Next”按钮, 会显示如图2所示的窗口, 在“Product Name”文本框输入 一个工程 名即可 ( 这里输入FirstCocos2dXGame), 然后再点击“Next”按钮 , 会要求选择工程存储的目录, 之后, XCode就会为建立一个标准的XCodeiOS工程。接下来直接在XCode中运行该程序即可。

在前面已经建立并运行了基于iOS的Cocos2d-x程序。不过使用Cocos2d-x开发游戏的主要目的之一是为了跨平台。所以现在看一下如何建立基于Android的Cocos2d-x程序。

在Cocos2d-x SDK的根目录中有两个脚本文件: createandroid-project.sh和create-android-project.bat。这两个脚本文件都用来建立使用Cocos2d-x的Android工程。其中前者用于Mac OS X和Linux平台, 后者用于Windows平台。

读者可以根据自己所使用的OS平台选择执行相应的脚本文件。但要注意, 无论执行哪个脚本文件, 在执行之前, 都需要在脚本文件中设置Android SDK和Android NDK的路径。create-android-project.bat还要设置Cygwin的路径。

对于create -android -project.sh脚本文件 , 需要设置NDK_ROOT_LOCAL和ANDROID_SDK_ROOT_LOCAL环境变量, 读者可以打开该脚本文件, 找到这两个环境变量, 并按自己机器上的Android SDK和Android NDK的路径进行设置。例如, 下面两行代码是在Mac OS X上的设置。

对于create-android-project.bat脚本文件 , 需要设置_CYGBIN、 _ANDROIDTOOLS和 _NDKROOT 3个环境变量。下面的代码是在Windows8.1上的设置。读者可以按自己机器上的路径进行修改。

按照上面的方式设置完相应的路径后, 可以直接执行脚本文件建立Android工程 (注意, create-android-project.sh脚本文件只能在Cocos2d-x SDK根目录运行)。在执行的过程中。会要求输入如下的信息。

(1) 包 (Package) 名

(2) 运行目标 (Target)

(3) Android工程名

这3个内容读者可任意输入。包名就是Android应用程序的主包名 , 这里输入 了mobile.android.cocos2dx.first.game。Target就是Android平台的版本。要求是Android2.2及以上版本。每一个版本都由一个数字表示。由于在脚本文件中指定了Android SDK的路径, 所以会直接调用/tools目录中的android命令显示当前机器上安装的所有Targets。也就是调用了“android list targets”命令。对应的数字在每一个Target的靠头部分。读者可以根据自己选择的Android版本输入相应的Target代码。例如, 本例选择的是Android4.2.2 (APILevel = 17), 对应的Target代码是30。最后要输入的Android工程名, 读者可以随意输入, 只要当前目录下没有同名的目录或文件即可。

输入完上面3个信息后, 脚本文件会自动生成一些目录和文件。在当前目录 (本例中直接在Cocos2d SDK根目录下执行了脚本文件) 下会发现多了一个AndroidFirstGame目录。该目录中有如下3个子目录。

(1) Classes

(2) proj.android

(3) Resources

其中Classes目录用来存放公共的源代码文件 (主要指.cpp和.h文件), proj.android是Android工程目录。Resources目录用于存放公共的资源文件 (如图像、音频文件等)。

在iOS工程中, 恰巧也有Classes和Resources目录 (实际上在XCode中称为Group, 不过为了与Android一致, 这里暂将其称为目录)。那么iOS工程和Android工程中的Classes与Resources有什么关 系呢 ? 以及如何 使iOS和Android工程共享源代码和资源呢 ? 这些问题都会从后面的内容得到答案。

2 共享源代码文件和资源文件

到现在为止, Cocos2d-x for iOS和Cocos2d-x for Android应用都可以非常完美地运行了。不过还有一个重要问题没解决。如 果用Cocos2d-x进行跨平 台开发 , 就需要iOS和Android工程共享大部分源代码文件和资源。只有这样, 在修改完一个平台的代码后, 另一个平台才能编译生成最新的目标文件。那么从前面完成的工作来看, iOS和Android的工程中的资源都是分开存放的, 并没有在一起。那么这部分将详细介绍如何合并这些源代码和资源文件。

2.1 共享源代码文件

首先来看看如何共享源代码文件。那么首先要搞清楚哪些源代码文件需要共享, 哪些不需要共享。

可能已经有的读者注意到了, 在iOS和Android工程中都已经默认生成了一些C++源代码文件。在iOS工程中生成了如下4个C++源代码文件。

(1) AppDelegate.cpp

(2) AppDelegate.h

(3) HelloWorldScene.cpp

(4) HelloWorldScene.h

Android工程实际上生成了5个C++源代码文件。不过从Android工程中只能看到一个main.cpp文件。由于AndroidNDK中所有参与编译的C++源代码文件必须在Android.mk中指定, 所以可以查看一些Android.mk文件中的内容, 经过查看, 会发现Android.mk文件中有如下的代码。

很明显, Android工程中使用的其他4个源代码文件 (2个cpp和2个.h文件) 与iOS工程中使用的4个源代码文件至少文件名是完全一样的, 经过对比, 文件内容也一样。所以现在就基本确认下来了, 这4个源代码文件需要共享 (这4个文件并不在Android工程目录, 而是在与工程目录同级的Classes目录中)。而Android工程之所以多出来一个main.cpp文件是因为在Android系统中, Java语言访问C++程序必须通过NDK, 而main.cpp正是NDK的入口文件。由于iOS中使用的Objective-C语言可以直接访问C++ 程序 , 所以并不需要像main.cpp一样的辅助文件。

由于iOS和Android工程中需要共享的C++源代码文件都在Classes目录中, 所以很自然就想到将所有需要共享的源代码文件都放在Classes目录中。不过iOS和Android工程中的Classes并不是同一个目录, 现在需要将其统一起来。

首先Android工程 (AndroidFirstGame) 和相关目录需要调整一些。从前面 的内容可 知 , 自动生成 的Cocos2d-x forAndroid项目目录由Classes、Resources和proj.android 3个目录组成。现 在需要将 这3个目录复 制到上一 层目录 ( 与AndroidFirstGame同级别), 然后原来的AndroidFirstGame目录就可以删除了。接下来将proj.android目录名改成AndroidFirstGame。最后在Eclipse中重新导入AndroidFirstGame工程。

目前Classes文件中的4个文件还无法在Android工程中看到, 如果读者想在Eclipse中编辑这些源代码文件, 可以创建一个文件夹链接。也就是点击Android工程右键菜单中“New”> “Folder”菜单项, 在显示的“New Folder”窗口中点击最下方的“Advanced”按钮, 然后选择“Link to alternate location(Linked Folder)”选项, 并点击“Browser”按钮选择Classes目录。该窗口的设置效果如图3所示。最后点击“Finish”按钮即可。这样就将Classes目录链接进Android工程了。

到现在为止, 关于Android工程中共享源代码的配置已经完成了。现在来处理iOS工程。

查看iOS工程后发现, 在iOS工程中也有Classes目录和同样的4个文件。不过为了共享, 应放弃iOS工程中的Classes目录, 并与Android工程共用同一个Classes目录。当然, iOS工程中的Classes目录也不需要删除, 只需要在XCode中删除Classes中的4个文件 , 然后选择iOS工程中的“Classes”节点。在右键工程菜单中选择“Add Files to“FirstCocos2dXGame””菜单项, 会弹出如图4所示的选择窗口。切换到Classes目录,全选这4个文件, 然后点击“Add”按钮添加即可。实际上,这个操作和前面在Eclipse中建立目录链接类似, 只是这里建立的是文件链接。要注意, 不要选择“Copy items in destinationgroup’s folder (if needed)”复选框, 否则XCode会将所有添加的文件都复制到iOS工程目录中的Classes目录中, 这样刚才的4个文件就白删除了。

现在一切就绪, iOS和Android工程的源代码已经完全共享了。读者可以在XCode中打开HelloWorldScene.cpp文件,找到如下的代码。

将“Hello World”修改成“Hello Cocos2d-x”。这时在XCode和Eclipse中运行各种的程序, 发现运行效果都发生了变化 (如果Android工程第一次运行无法更新效果, 可能是因为同步的问题, 再运行一次即可, 或直接用命令行方式编译程序)。

2.2 共享资源文件

如果理解了共享源代码文件 (也就是共享Classes目录)的方式, 那么共享资源文件 (也就是共享Resources目录) 就容易得多了。

由于Cocos2d-x for Android工程中的所有Cocos2d-x用到的资源都放在Android工程中的assets目录中, 所以最简单的方法是将assets目录指向Resources目录即可。现在可以删除assets目录, 然后按着前面介绍的方法创建一个名为assets的目录链接, 这样assets就和Resources目录融为一体了。

在XCode中有一个Resources目录 (实际上也是group),这里面的资源并不都需要共享, 要想知道哪些资源需要共享,只需要看一下自动生成的Android项目的Resources目录包括哪些资源即可。经过查看, 在Resources目录中只包含了如下3个图像文件。

(1) CloseNormal.png

(2) CloseSelected.png

(3) HelloWorld.png

毫无疑问, 这3个图像文件需要共享。所以首先要在XCode中删除这3个文件, 然后按着建立目录链接的方式建立文件链接。建立这3个文件的链接。现在资源 (Resources) 在iOS和Android工程之间已经完全共享了。

3 使用 create_project.py 建立跨平台工程

在前面的内容中使用了XCode的模板和create-androidproject.sh脚本文件分别创建了iOS和Android工程。这样做尽管对于单独开发iOS和Android版的游戏很方便, 但如果开发跨平台的游戏, 就需要为各种平台建立相应的工程, 而且从前面的内容可以看出, Cocos2d-x只能通过XCode模板和createandroid-project.sh脚本文件建立iOS和Android工程。至于其他平台的工程 (如Win32、Mac OS X工程) 就需要手工处理了。

事实上并非如此。Cocos2d-x还提供了另外一个工具, 可以一次性建立多个平台的工程。该工具是一个Python脚本文件, 路径如下:

执行该脚本文件的命令行格式如下:

从上面的格式可以看出, create_project.py脚本文件需要跟3个命令行参数, 这些命令行参数的含义如下:

(1) -project: 工程名称, 也就是跨平台工程的目录名。

(2) -package: 包名, 只针对Android工程。

(3) -language: 生成的跨平台工程使用的语言。可以设置的值是cpp、lua和JavaScript。分别表示使用C++、Lua和Javascript。

下面是create_project.py脚本文件标准的调用形式。在执行这行命令之前 , 当前机器 上要安装Python。建议使 用Python2.7。Python3.x与该脚本文件不兼容, 执行会报错。

如果成功执行了create_project.py脚本文件, 会在/projects目录下生成一个名为MyGame的子目录, 这就是跨平台工程目录。该目录的结构如图5所示。

从MyGame目录的结构可以看出, 已经包含了Classes和Resources目录, 这两个目录分别是用来存放需要共享的源代码文件和资源文件的。其他的目录是与各个平台对应的工程目录。这些目录与平台的对应关系如下:

(1) proj.android: Android

(2) proj.blackberry: 黑莓OS

(3) proj.ios: iOS

(4) proj.linux: Linux

(5) proj.mac: Mac OS X

(6) proj.marmalade: 一种跨平台游戏开发的SDK (Marmalade SDK)

(7) proj.win32: Windows

从上面的描述可以看出, Cocos2d-x自动生成了7个平台的工程。其中用的最多的是Android和iOS。读者可以直接在XCode和Eclipse中打开proj.ios和proj.android工程。如果读者打开proj.ios工程, 应该从工程列表上方选择“MyGame”, 然后选择合适的iOS模拟器或真机 (iPhone或iPad), 如图6所示。最后运行即可。

4 星际大战游戏

到现在为止, 读者已经完全了解了如何通过Cocos2d-x开发跨平台 (主要指Android和iOS) 的游戏。从本节开始, 将接触一款射击类游戏: 星际大战。其主界面如图7所示。

星际大战主要包括我方的战机和敌方的若干架敌机, 敌方和我方的战机都可以发射子弹, 我方有3架战机可用, 当所有战机被摧毁后游戏结束。

本游戏分为多个场景, 这些场景包括主菜单场景、游戏场景和关于场景。这些场景分别由相应的场景类来实现。在后面的部分会详细介绍这些场景类的实现过程。 在游戏中需要使用大量的资源, 这些资源已经随着游戏的源代码提供了。本游戏将使用多种技术, 例如, 场景切换、声音播放和停止、移动精灵、碰撞检测、播放动画等。 这些技术将在后面的内容详细介绍。

5 本地化游戏

这里的本地化主要是指适应不同分辨率的屏幕。在Cocos2d -x中通常是使用设计尺寸来完成这个功能的。在AppDelegate::applicationDidFinishLaunching方法中会 调用setDesignResolutionSize方法了指 定设计尺 寸 , 在这里是(480,800)。该方法的代码如下:

如果当前屏幕正好等于设计尺寸, 那么尺寸和位置就正好符合设计尺寸, 否则尺寸和位置会根据设计尺寸自动调整。例如, 如果当前屏幕的分辨率是 (960,1600), 那么在程序中使用的所有尺寸和位置都会加倍。现在程序中的所有的尺寸和位置都可以按设计尺寸来进行指定, 也就是说, 使用固定的值即可。

6 主菜单场景

首先读者 应按照前 面的方法 建立Cocos2d -x工程(starwar), 然后创建一个主菜单场景类 (GameMenuScene.cpp和GameMenuScene.h)。在该场景中, 将显示两个按钮, 其中一个按钮进入游戏场景, 另外一个按钮进入关于场景。在该场景中还会显示其他一些节点, 其中包括一些图像和一个用于控制声音开启和关闭的按钮, 效果如图8所示。下面介绍场景实现过程。

首先来实现这个场景类的头文件, 代码如下:

在GameMenuScene.cpp文件中实现了GameMenu类中的方法。首先在onEnter方法中初始化了相应的节点, 例如背景图、标题、菜单、声音等。代码如下:

在GameMenu类的其他方法中, 还完成了更多的功能。例如, 在onEnter方法中设置了动画, 以便使菜单以动画方式进入场景。menuNewGameCallback方法则进入了新的游戏场景。menuSoundCallback方法则负责关闭和打开背景音乐, 代码如下:

7 实现星际飞船的移动

在这一部分实现星际大战的最主要的部分之一: 星际飞船。就是图9中下方红色的飞船 (上方的是敌机, 后面再讨论如何实现)。

星际飞船主要功能有两个。

(1) 发射子弹。

(2) 通过手指的移动 (在PC上通过鼠标控制) 可以控制飞船的移动。

下面就来看看这两个功能是如何实现的。首先看一个星际飞船类 (GameObjHero) 的定义, 代码如下:

在这里先看看如何实现星际飞船的移动。首先应该编写一个containsTouchLocation方法, 用于判断手指触摸的是否为星际飞船, 代码如下:

该方法的实现很简单, 只有一条语句, 用于判断手指触摸的坐标是否落到星际飞船中。因为touch返回的是相对于OpenGL View坐标系的坐标。

接下来是控制星际飞船的移动, 该功能需要通过手指的触摸和移动动作完成, 涉及到如下3个方法。

8 星际飞船发射子弹

在GameObjHero类中有一个releasebullet方法, 该方法负责发送子弹, 代码如下:

从releasebullet方法的代码可以看出, 该方法调用了GameMain::releaseheroBullet方法发射子弹, 所以现在看一下该方法是如何实现的。

从releaseheroBullet方法的代码可以看出, 该方法扫描了子弹数组 (buttlets), 如果发现没有使用的子弹 (不可见的),就会使用该子弹。

这里的buttlets是CCArray类型变量, 在GameMain::init方法中初始化, 代码如下:

从这段代码可以看出, 共创建了5个GameHeroBullet对象(子弹类), 当然, 这5个子弹对象默认都是不可视的, 直到某个子弹被使用 (发射), 才会变成可视的。当子弹移出屏幕或击毁敌机后, 又会变成不可视的, 这样就可以继续处于发射状态了。这就保证了不会创建更多的GameHeroBullet对象。不过要保证飞船不能在第一发子弹还未消失后, 再连续发射5发或以上的子弹, 否则子弹就不够用了。也就是说, 屏幕上同时可视的子弹不能超过5发。

9 星际飞船的子弹类

星际飞船的子弹的实现相对简单些, 由GameHeroBullet.cpp和GameHeroBullet.h文件来实 现。下面 先看一下GameHeroBullet类的定义。

在GameHeroButtet类中, onEnter方法负责装载子弹图像,而setIsVisable和setIsNotVisiable方法分别负责使用Action使子弹移动, 已经停止动作。代码如下:

10 敌机和敌机子弹的移动

从这一步开始讲解如何实现敌机的各种动作。这一部分主要讲解如何移动敌机和敌机子弹。通常射击类游戏敌机是电脑控制移动的。在星际大战游戏中, 敌机采用了贝塞尔的移动轨迹。主要实现文件是GameObjEnemy.h和GameObjEnemy.cpp。下面先看一下GameObjEnemy类的定义代码。

在GameObjEnemy类中主要的方法包括releasebullet (释放子弹)、movestart (开始移动敌机)、setdie (将敌机设为死亡状态, 也就是用动画显示爆炸效果)。

首先看一下onEnter方法, 该方法装载了敌机图像和爆炸效果的第一张图, 代码如下:

接下来看敌机如何以贝塞尔曲线方式运动, 代码如下:

现在还需要一个restart方法来调用movestart方法, 该方法的代码如下:

在movestart方法中的最后还不断调用releasebullet方法发射敌机子弹。该方法会在实现创建的敌机子弹集合中选择一些还未使用的子弹。

最后在GameScene类的Init方法中创建敌机对象时, 直接调用了movestart方法来使敌机运行, 代码如下:

11 敌机子弹类

在这一部分将实现敌机子弹类 (GameEnemyBullet), 首先看一下GameEnemyBullet的定义代码。

其中最重要的方法当属setIsVisable和setIsNotVisable方法, 前者使用Action使子弹移动。后者通过停止动作使子弹停止。代码如下:

12 检测子弹与飞船的碰撞

尽管检测碰撞的代码并不复杂, 但却是游戏的关键。因为不管星际飞船、子弹和敌机如何运动, 如果不发生碰撞, 那就只是动画, 不是游戏。

检测碰撞的方法很多, 这里采用了比较简单的矩形碰撞检测方法。这种方法实现起来很简单, 只是检测两个矩形左右两点的水平坐标之差 (取绝对值) 是否小于两个矩形宽度之和(高度和垂直坐标也用同样的方法检测 )。如果前者小于后者 ,表示发生了碰撞。下面看一下实现代码

13 结语

【Cocos2d-X】推荐阅读:

上一篇:土建工程预结算审核下一篇:重症高血压脑出血

本站热搜

    相关推荐