《魔塔天城》发布已经有半年的时间了,一直想找时间来总结一下这个项目,但总是一拖再拖。如果再这么拖下去,就永远都不会有时间来写这个总结了,时间总是挤出来的。

魔塔天城使用的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 魔塔项目总结(一)的更多相关文章

  1. 在Xcode 6 beta里编译Cocos2d-x iOS项目时失败

    转载 在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwr ...

  2. <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机

    准备 今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2 ...

  3. 一个cocos2d-x的项目

    前几天完成了一个cocos2d-x的项目,放在git上: https://github.com/gittor/Jigsaw 采用cocos的版本是3.7.1. 项目是一个拼图的游戏,市面上的拼图类游戏 ...

  4. cocos2d-x学习之旅(五):1.5 使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机

    今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2d-x ...

  5. 解决Xcode 6 编译Cocos2d-x iOS项目失败

    在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwrite ...

  6. 创建cocos2d-x+lua项目

    1>     创建cocos2d-x+lua项目 进入到cocos2d-x-2.1.5\tools\project-creator文件夹运行下面命令: python create_project ...

  7. 分享个win平台cocos2d-x创建项目的快捷方式

    由于长期使用vs开发,相信使用vs开发的同学们也和我一样,都习惯点击图标然后就新建项目了,不是很适应命令的方式 由于vs2012一般都是win7 win8 win8.1这类系统开发,而这些系统,都是自 ...

  8. cocos2d-x 新建项目 Cannot open include file: ‘cocos2d.h’

    新建cocos2d-x 项目分这么几步. 1. 下载最新的cocos2d-x 2. 安装 vs2010 3. 解压cocos2d-x 压缩包,并双击"install-templates-ms ...

  9. [Cocos2d-x]创建项目

    从cocos2d-x 2.1.4之后,就不提供工程项目模板的安装文件了,我们只能手工修改以前的安装文件,让它连接最新的工程,但是这样很麻烦. 我们可以使用python命令创建cocos2d-x项目 步 ...

随机推荐

  1. #最小生成树# #kruskal# ----- OpenJudge丛林中的路

    最小生成树 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法 ...

  2. SSM框架整合(注解)-Spring+SpringMVC+MyBatis+MySql

    准备工作: 下载整合所需的jar包 点击此处下载 使用MyBatis Generator生成dao接口.映射文件和实体类 如何生成 搭建过程: 先来看一下项目的 目录结构 1.配置dispatcher ...

  3. OCR技术浅探: 语言模型(4)

    由于图像质量等原因,性能再好的识别模型,都会有识别错误的可能性,为了减少识别错误率,可以将识别问题跟统计语言模型结合起来,通过动态规划的方法给出最优的识别结果.这是改进OCR识别效果的重要方法之一. ...

  4. getstyle() 获取样式

    问题:在js动画中,如果元素设置了border,padding等,获取到的样式是盒子的样式,这样会影响动画的正常显示. 解决方案一:在元素的行内添加样式  如 <div style=" ...

  5. Java性能优化_转载

    一.避免在循环条件中使用复杂表达式 1.在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 2.不可使用多层循嵌套. 二.集合大 ...

  6. final对于访问效率的影响

    在能够通过编译的前提下,无论局部变量声明时带不带final关键字修饰,对其访问的效率都一样. 并且:重复访问一个局部变量比重复访问一个成员或静态变量快:即便将其final修饰符去掉,效果也一样. 例如 ...

  7. CTR预估中的贝叶斯平滑方法及其代码实现

    1. 背景介绍 广告形式: 互联网广告可以分为以下三种: 1)展示广告(display ad) 2)搜索广告(sponsored search ad) 3)上下文广告(contextual ad)   ...

  8. C#剪贴板对文件的复制、粘贴操作

    1.把文件加到剪贴板: System.Collections.Specialied.StringCollection files=new System.Collections.Specialied.S ...

  9. 网络攻击技术开篇——SQL Injection

    本文转自: http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库 ...

  10. C语言 一维数组叠加为二维数组样例

    这里参看memcpy的用法,将一个一维整型数组不停的叠加为二维数组 使用宏定义来控制二维数组的行列 代码如下: #include <stdio.h> #include <stdlib ...