cocos2dx 魔塔项目总结(一)
《魔塔天城》发布已经有半年的时间了,一直想找时间来总结一下这个项目,但总是一拖再拖。如果再这么拖下去,就永远都不会有时间来写这个总结了,时间总是挤出来的。
魔塔天城使用的cocos2dx 3.2版本,当时这个版本刚刚发布。网上的学习资料都是2.0版本的。只有官网提供的示例demo是最新的,好在这些demo涵盖的面比较宽,对于学习API来说已经足够了。
魔塔的程序框架并不复杂
总的来说就是这几大块,对象继承结构,碰撞检测,node和layer层次结构,UI实现,剧情脚本
在魔塔世界中 World是由Cell构成的,所有的事物都是Cell。我们按照MVC思想来分析一下Cell
model:Cell的属性集合就是我们所说的MVC模式中model,我们从外部读取数据表格文件中的数据(这里我使用了csv文件),然后初始化这些Cell的model(注意:数据表格中的数据通常记录的是类的基本属性),在游戏中不同的对象model会产生不同的变化,如果我们想要保存这些变化,只要保存这些容易发生变化的属性就行了,这里假设保存在model_New里。然后下次再加载存档的时候,首先利用数据表格初始化model,然后再加载保存的model_New覆盖合并当前model,这就是基本的存档功能。
所以我的Cell必须实现这些初始化,加载并保存model的功能,这里我们就可以添加这些函数
virtual void initModel() = ;
virtual void loadModel(ValueMap &map) = ;
virtual ValueMap saveModel() = ;
这里我们使用cocos2dx 3.2 提供的 ValueMap数据结构实现我们的model。
view:这里的View应该不单单是一张张图片,因为我们还需要动画。所以cocos2dx里面的Sprite显示精灵是最佳选择。
controller:事物之间是需要交互的,这样我们的世界才如此生机盎然。在程序里,事物就是对象,那么如何让对象之间交互呢,没错,利用事件Event。cocos2dx已经为我们实现好了这些事件机制,我们唯一需要做就是为每个对象添加事件侦听或回调函数,一个发送事件,一个接受事件并作出反映,这就实现了交互。当然,我们也可以通过发送事件来操纵对象,就像游戏中的控制台一样,让对象接收命令。
事件监听
_listener = EventListenerCustom::create(getName(), [=](EventCustom *event){onTrigger(event);});
_eventDispatcher->addEventListenerWithFixedPriority(_listener, );
回调函数
virtual bool onTrigger(EventCustom *event) = ;
事件机制就是观察者模式的衍生,在cocod2dx中我们的事件都由EventDispatcher的一个实例来管理,这就像是接线员一样。会根据号码(事件id)来传递事件。这个事件id我们用对象的名字来表示,因此,这就变得非常好理解了,对象之间通过名字来交互也更现实些。
Cell是万物的基类,由此我们可以派生出Item、Actor等一系列子类。万物是由上帝创造的,在这个程序架构的世界里,我们就是上帝。但是要让我们一个一个new对象却是很累,所以工厂模式是派上用场了。CellFactory,根据我们的订单创建Cell,它有可能是一个道具,也有可能是个NPC。总之把你的需求打包成一个map数据结构传递给工厂就行了。
创建完成了Cell,但我们还要把它添加到世界里。
World是个魔塔的世界,这个世界除了塔没别的。所以World里包含Tower的数组
Tower魔塔是由一层一层的Floor构成的,所以Tower里面有Floor的数组。
我们是世界的二维的,每次只能显示一层Floor。所以Floor就是游戏地图的基本单位。我们创建的Cell都要添加到Floor里面,Floor会包含很多元素(地面、墙壁、怪物、NPC、道具等等),也就是说这些元素都要派生自Cell。
Cell也是碰撞检测的基本单位,魔塔中的碰撞检测是基于方格碰撞的。Cell的有效碰撞区域都是一个个相同大小的方块。碰撞检测说到底就是通过数学计算判断两个形体是否相交。为了简化计算,我们通常把形体简化成矩形或长方体。如果是多个物体的话,我们往往会让每个物体都跟其他物体作比较,如果物体很多的话,这会非常耗时。所以我们需要方法简化比较次数,比如有些物体之间相距很远,是绝对不可能会碰到的,通过划分区域可以很好的解决这个问题。区域的划分也是十分讲究的,比如四叉树算法、八叉树算法。这里不做具体分析,有兴趣的同学可以自行百度。在魔塔中,我们就不用使用这些复杂的算法了,因为我们的地图通常并不大,但是区域划分是不能忽略的,我们可以将地图划分为网格。网格中的每一个小方格都是一个区域,而且大小与Cell的有效碰撞区域相同。
cocos2dx 魔塔项目总结(一)的更多相关文章
- 在Xcode 6 beta里编译Cocos2d-x iOS项目时失败
转载 在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwr ...
- <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机
准备 今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2 ...
- 一个cocos2d-x的项目
前几天完成了一个cocos2d-x的项目,放在git上: https://github.com/gittor/Jigsaw 采用cocos的版本是3.7.1. 项目是一个拼图的游戏,市面上的拼图类游戏 ...
- cocos2d-x学习之旅(五):1.5 使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机
今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2d-x ...
- 解决Xcode 6 编译Cocos2d-x iOS项目失败
在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwrite ...
- 创建cocos2d-x+lua项目
1> 创建cocos2d-x+lua项目 进入到cocos2d-x-2.1.5\tools\project-creator文件夹运行下面命令: python create_project ...
- 分享个win平台cocos2d-x创建项目的快捷方式
由于长期使用vs开发,相信使用vs开发的同学们也和我一样,都习惯点击图标然后就新建项目了,不是很适应命令的方式 由于vs2012一般都是win7 win8 win8.1这类系统开发,而这些系统,都是自 ...
- cocos2d-x 新建项目 Cannot open include file: ‘cocos2d.h’
新建cocos2d-x 项目分这么几步. 1. 下载最新的cocos2d-x 2. 安装 vs2010 3. 解压cocos2d-x 压缩包,并双击"install-templates-ms ...
- [Cocos2d-x]创建项目
从cocos2d-x 2.1.4之后,就不提供工程项目模板的安装文件了,我们只能手工修改以前的安装文件,让它连接最新的工程,但是这样很麻烦. 我们可以使用python命令创建cocos2d-x项目 步 ...
随机推荐
- Eclipse 自动生成getter 和 setter
示例: public String View;//右击View > Source > Generate Getters and Setters... public String view; ...
- JVM内存划分基础知识
第一部分 JVM内存划分 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbag ...
- xhtmlrenderer渲染pdf,中文换行
在实际开发中,发现在table中显示中文,渲染出来的pdf,中文内容不自动换行.经过搜索发现了一种解决方案,如下: 重写Breaker,修改right计算方式 /* * Breaker.java * ...
- 超棒的30款JS类库和工具
http://www.csdn.net/article/2013-07-01/2816068-best-javascript-libraries-and-tools
- Firebug及YSlow简介与使用图文详解
Firebug本是Firefox浏览器下一个出色的网页设计插件,随着浏览器的发展,Firebug也推出了支持IE.Opera.Chrome的Firebug Lite.凭借Firebug的出色代码调试功 ...
- python实现二分查找与冒泡排序
二分查找,代码如下: def binarySearch(l, t): low, high = 0, len(l) - 1 while low < high: 'print low, high' ...
- HDU1716(全排列)
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- (一)Lua脚本语言入门
今天开始自己的Lua语言学习,Lua脚本语言,是介于应用程序和开发其应用程序的底层编程语言之间,,它很方便调用其它语言,它只是在载入时对其进行编译,而不像我们写的单片机程序是预编译的,先编译好然后写入 ...
- 说说 bash 的 if 语句
说说 bash 的 if 语句 在开始先给大家列出几个术语,不做解释,不懂的可以参考其它资料. 术语和符号: 退出状态码 $? [...] (中括号,方括号) [[...]] (双中括号,双方括号) ...
- UINavigationController实现全屏滑动返回功能
说明: UINavigationController默认在push出的控制器中都有边沿滑动返回功能,但是只能从屏幕左边滑才能返回,若从屏幕中间画并没有效果.下面实现全屏滑动功能. 探究: 系统默认能够 ...