Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物
如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~
所以。必须可配置。不然会累死人的。
笨木头花心贡献,啥?花心?不呢,是用心~
转载请注明,原文地址: http://www.benmutou.com/blog/archives/949
文章来源:笨木头与游戏开发
Json文件
什么是Json文件?说白了。它就是一个文本文档。仅仅只是它的内容是依照一定的规则填写的。
于是,我们就能够依照那个规则去读取这份文档。
这,就是配置文件产生的缘由(才怪)。
(小若:才怪是什么意思啊喂!)
我不知道配置文件产生的历史,但它的原理就是这种~
关于Json的资料。百度非常多,我坦白。我自己也没有深入地完整地使用过Json的全部东西。
所以,大家感兴趣的,能够百度一下。
怪物类型配置文件
我们在这个游戏要用到的Json格式主要是数组(array)和对象(object),来我们在项目的Resources文件夹下创建一个新文件,命名为:monsterConf.plist
然后随便用一个文本编辑器打开,输入下面内容:
[
{"id":1, "atk":1, "model":"item2.png"} // 1.普通。-1HP
,{"id":2, "atk":-1, "model":"heart_red.png"}// 2.爱心,+1HP
]
非常明显。由符号“[]”框起来的就是数组,数组里面用“{}”包围起来的,就是对象,对象之间有逗号分隔。
里面就是我们的怪物配置,这里我们仅仅填写id、atk、model三个属性,完整版的《别救我》里面是有9个属性的。
导入Json库
要想在程序中读写Json文件,我们就用别人已经写好的库,说库太高深了,就是一些h和cpp文件。
我使用的是JsonCpp库,大家能够到这里下载:http://download.csdn.net/detail/musicvs/7392931
下载好后,解压json文件夹到项目的Classes文件夹下,然后就像导入代码文件一样导入到项目中就能够了。
如图:
Cocos2d-x3.0游戏实例之《别救我》第十篇——用Json配置各类型怪物数据
Cocos2d-x3.0游戏实例之《别救我》第十篇——用Json配置各类型怪物数据
在程序中读取Json配置文件
好。这次真的是最后一步了,我们改动Monster的init函数:
- bool Monster::init(int ID)
- {
- this->m_ID = ID;
- /* ----------- 读取怪物配置文件 ------------ */
- /* 读取配置文件字符串数据 */
- std::string sData = FileUtils::getInstance()->getStringFromFile("monsterConf.plist");
- /* 用于解析Json */
- Json::Reader reader;
- /* 解析Json后的根节点 */
- Json::Value root;
- /* 開始解析 */
- if (!reader.parse(sData, root, false))
- {
- return false;
- }
- /* 在这里。根节点是一个数组,遍历数组,找到我们要的ID */
- int size = root.size();
- for (int i = 0; i < size; ++i)
- {
- int id = root[i]["id"].asInt();
- if (id == ID)
- {
- m_sModelPath = root[i]["model"].asCString();
- break;
- }
- }
- return true;
- }
有点小复杂,没关系。你们自己理解理解就好了…啊才怪啊,怎么可能!
(小若:抢我台词O_O)
解释例如以下:
1. 首先,用FileUtils的getStringFromFile函数能够把文件读取成字符串格式,Json解析须要用到
2. 然后用Json库的Reader类能够解析Json文件
3. 解析之后。根节点赋值给root,通过root能够找到其它子节点
4. 由于我们配置文件中根节点就是一个数组,我们是用数组包围了怪物的配置数据的,没忘记吧?看看配置文件就知道了。整个数据是用“[]”符号包围的~
5. 然后遍历root节点。就像数组一样遍历
6. 比方root[0],那就是第一条怪物配置数据,然后通过root[0][“id”]就能找到这条数据的id字段的值
7. 找到我们ID配置的数据。然后获取它的全部字段,眼下我们要用到的仅仅有model字段而已。
OK,别忘了,要使用Json库的类,把头文件也在Monster顶部加上:
- #include "json\writer.h"
- #include "json\reader.h"
然后,编译执行,效果和之前是一样的,证明我们已经成功。
PS:有人反馈Json库编译报一堆错误,试试下面操作:
项目属性,【C/C++】->【常规】->【附加包括文件夹】,看看”..Classes”这一条有没有加上去,并且是不是在第一条。把它放在第一条试试。
额外的说明
或许大家要喷了。各种疑问:
1. 为什么读取一个配置文件就这么复杂,这么多部分。那不是非常麻烦?
答:由于这是实例教程,不想涉及太多的东西,所以我就尽量没有去封装了,在完整版里我是封装了一个JsonData类的,解析Json文件仅仅需简单的一、两句话。
2. 每创建一个怪物对象,就要这样解析一次。岂不是非常浪费效率?
答:效率浪不浪费我就没有去试验了,可是实际开发中肯定不会这样做的。
在完整版的《别救我》里,我是预先载入好怪物的配置文件。然后作为一个个对象(MonsterConfig)缓存起来,要使用的时候。直接依据怪物ID获取就能够了。
不会每次都去解析Json。
总之。一切从简。点到即止。否则我这教程不知道得写到什么时候了。
最后,主角和怪物的碰撞
最后完好一个功能点,主角和怪物的碰撞,非常easy,不须要加东西。
OK,执行游戏。然后我已经把怪物全都撞没了~如图:
Cocos2d-x3.0游戏实例之《别救我》第十篇——用Json配置各类型怪物数据
(小若:等等。刚刚发生了什么事情?)
刚刚大家被我弄昏了(邪恶),我们回到刚刚的时间…
最后完好一个功能点,主角和怪物的碰撞。非常easy,不须要加东西。
改动一下TollgateScene的onContactBegin函数:
- bool TollgateScene::onContactBegin(PhysicsContact& contact)
- {
- /* 这里省略了非常多代码 */
- /* 碰撞到边缘锯齿(墙),+1血 */
- if (other->getTag() == ObjectTag_Border)
- {
- /* 扣-1血。就相当于加1血 */
- player->beAtked(-1);
- log("player cur HP:%d", player->getiHP());
- }
- else if (other->getTag() == ObjectTag_Monster)
- {
- /* 碰撞到怪物。依据怪物的属性进行操作 */
- Monster* monster = (Monster*)other;
- if (monster->getiAtk() != 0)
- {
- /* 攻击玩家(可能是加血) */
- player->beAtked(monster->getiAtk());
- /* 碰撞之后,怪物消失 */
- monster->removeFromParent();
- }
- }
- return true;
- }
我们新增了一个else if分支,推断假设other是怪物的话。那就对玩家进行攻击(或者加血)。碰撞怪物之后,怪物就消失。
OK,如今执行游戏,我们就能够用主角碰撞怪物。然后怪物消失。
同一时候主角的HP会不断变化(从日志中查看)。
在《别救我》完整版里,玩家的任务是让主角的血量为0,所以是不能碰撞那些会加血的怪物的。
并且怪物也不是碰一下就消失。有些要碰好几下。
总之,所以的这一切都能通过改动怪物的配置文件来实现,给怪物加属性配置字段。我们就能实现多种多样的功能。
同一时候,还能通过改动TiledMap关卡配置文件。给矩形对象加入很多其它属性,比方加入怪物出场时的推力属性,这样怪物出场的时候就会往某个方向喷射。(于是连飞机大战都能做出来。所以这个就靠想象力了)
我给大家看一个完整版的关卡配置:
Cocos2d-x3.0游戏实例之《别救我》第十篇——用Json配置各类型怪物数据
蓝色的怪物在出场的时候是会往上飞的,看起来就像是飞机的子弹,非常有意思的配置吧~
OK,《别救我》全部的核心功能已经完毕。剩下的,就是各种开场动画、菜单、UI、关卡了。
记得把物理引擎的调试模式关掉,不然会一直有非常多红色的线。
结束语
好了,《别救我》简化版游戏实例教程,到此结束。
希望多多少少能帮到大家。
假设对完整版感兴趣的,能够到我的淘宝店购买完整版源代码。这是对我最好的物质支持~地址:果断要看看
假设对完整版不感兴趣的,又想支持我的(哎呀,大家太热情了我也不想的(害羞)),能够点击我博客右上方的的“支付宝捐赠”。任意一下~
尽管捐赠不能让我成为土豪。可是它是对我最好的精神支持~
版权声明:本文博主原创文章。博客,未经同意不得转载。
Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物的更多相关文章
- Cocos2d-x3.0游戏实例《不要救我》第一章——前言
我们可以学习? 这是一个非常easy游戏.但更多的东西用(对于初学者).至少,对于它的一个例子,有点多. 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www.benm ...
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/musicvs/article/details/25368273 好吧.我真心全然搞不懂.我如今仅仅只 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- Cocos2d-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件
这篇的内容非常easy,获取UI控件,然后使用它. 还记得我们在UI编辑器中给三个button分别命名了吧? 如今要用上了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http ...
- Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用操心.这太简单了~! 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www ...
- Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角
好了,前面说了那么多废话,最终要进入正题了(等等,敢情前面你都是在耍我们么?) 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blo ...
- Cocos2d-x3.0游戏实例《不要救我》三——背景滚动周期
好.让我们来解释一下这个无限循环滚动的背景.这方面的知识一直讲到烂.我以前的文章还介绍了.所以不是那么特别清楚. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www. ...
- Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測
事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖); // 0001 ); // 0001 ); // 0001 这样我们才干监听到它们的碰 ...
- 1、Cocos2dx 3.0游戏开发找小三之前言篇
尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...
随机推荐
- C语言中结构体參数变量的传递
[文章摘要] 在C语言中,结构体參数变量常常作为函数的參数来进行传递.但假设參数设置不当.会出现内存问题. 本文以实际的程序代码为例.具体地介绍怎样正确地使用结构体參数变量.为相关的开发工作提供了參考 ...
- Xamarin:制作并发布apk
原文:Xamarin:制作并发布apk 终于到了激动人心的时刻:要向真机发布apk了.流程如下: 1 制作release版的android应用安装包apk文件: 1.1 用VS2012中文版制作:记得 ...
- linux下使用vi操作
ESC : 进入命令模式 linux下使用vi后,怎样跳转到文件结尾 pagedown键连续按 虽然我也这么用,但还是太笨了.问了高手,方法是按shift+g,另外,到文件开头是gg. linux ...
- JavaScript三在弹出的对话框中
据悉js小伙伴会发现,我们在某些情况下使用的alert()办法.prompt()办法.prompt()办法.它们在屏幕上的对话框.容,使用这样的方法使得页面的交互性更精彩.实际上我们常常会在进行网页浏 ...
- 很实用的FTP操作类
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.IO; using ...
- [置顶] android系统如何在静音模式下关闭camera拍照声音(2)
之前写过一篇“android系统如何在静音模式下关闭camera拍照声音”的博客,今天来写他的续篇,继续探讨这个问题. 公司新需求,要求在camera应用中添加一个开关,可以进行拍照声音的关闭和开启. ...
- 获取LayoutInflater的三种方式
1.LayoutInflater.from(mContext); 2.Activity类的getLayoutInflater 3.(LayoutInflater)mContext.getSystemS ...
- ASP.NET Core 1.0 部署 HTTPS
ASP.NET Core 1.0 部署 HTTPS ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1) 提示 更新时间:2016年01月23日. 在目前介 ...
- 谷歌技术面试要点(Google面试)(14年5月20日交大专场)
技术面试的主题 1.简要自我介绍: 姓名.学校.专业 做过的项目与实习 个人主要成就 2.技术评估: 构建与开发算法 编程 计算机基础知识 数据结构 现实世界问题解决能力 设计问题(主要针对博士生) ...
- js匀速运动停止条件
匀速运动,怎么让它到达指定位置时停止呢? 原理: 1,物体和目标的差值距离小于等于速度时,即停止 2,接着让物体移动位置等于目标位置 示例:匀速运动停止 html部分 <input type=& ...