现在我们有2种类型的怪物,而且创建的时候是写死在代码里的,这是要作死的节奏~

所以,必须可配置,不然会累死人的。

笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址: http://www.benmutou.com/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函数:

  1. bool Monster::init(int ID)
  2. {
  3. this->m_ID = ID;
  4. /* ----------- 读取怪物配置文件 ------------ */
  5. /* 读取配置文件字符串数据 */
  6. std::string sData = FileUtils::getInstance()->getStringFromFile("monsterConf.plist");
  7. /* 用于解析Json */
  8. Json::Reader reader;
  9. /* 解析Json后的根节点 */
  10. Json::Value root;
  11. /* 开始解析 */
  12. if (!reader.parse(sData, root, false))
  13. {
  14. return false;
  15. }
  16. /* 在这里,根节点是一个数组,遍历数组,找到我们要的ID */
  17. int size = root.size();
  18. for (int i = 0; i < size; ++i)
  19. {
  20. int id = root[i]["id"].asInt();
  21. if (id == ID)
  22. {
  23. m_sModelPath = root[i]["model"].asCString();
  24. break;
  25. }
  26. }
  27. return true;
  28. }

有点小复杂,没关系,你们自己理解理解就好了…啊才怪啊,怎么可能!(小若:抢我台词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顶部加上:

  1. #include "json\writer.h"
  2. #include "json\reader.h"

然后,编译运行,效果和之前是一样的,证明我们已经成功。

PS:有人反馈Json库编译报一堆错误,试试以下操作:

项目属性,【C/C++】->【常规】->【附加包含目录】,看看”..Classes”这一条有没有加上去,并且是不是在第一条,把它放在第一条试试。

额外的说明

也许大家要喷了,各种疑问:

1. 为什么读取一个配置文件就这么复杂,这么多部分,那不是很麻烦?

答:因为这是实例教程,不想涉及太多的东西,所以我就尽量没有去封装了,在完整版里我是封装了一个JsonData类的,解析Json文件只需简单的一、两句话。

2. 每创建一个怪物对象,就要这样解析一次,岂不是很浪费效率?

答:效率浪不浪费我就没有去试验了,但是实际开发中肯定不会这样做的。在完整版的《别救我》里,我是预先加载好怪物的配置文件,然后作为一个个对象(MonsterConfig)缓存起来,要使用的时候,直接根据怪物ID获取就可以了。不会每次都去解析Json。

总之,一切从简,点到即止,否则我这教程不知道得写到什么时候了。

用Json配置飞行棋地图/各类型怪物数据相关推荐

  1. Cocos2d-x3.0游戏实例之《别救我》第十篇(完结)——用Json配置各类型怪物数据

    现在我们有2种类型的怪物,而且创建的时候是写死在代码里的,这是要作死的节奏~ 所以,必须可配置,不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www ...

  2. Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物...

    如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www ...

  3. C#双人飞行棋小程序

    项目源代码    提取码:3306 备注:本程序基于Microsoft Visual Studio 2019,请选择支持本案例解决方案的编辑工具打开. 视频详解请戳:传智播客C#控制台飞行棋小程序 u ...

  4. 【黑马程序员】9. 骑士飞行棋

    ---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- 本项目使用的是面向过程的程序设计思 ...

  5. C#基础(10)——飞行棋游戏

    1.打印游戏头 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  6. 【全栈计划 —— 编程语言之C#】 C# 实现双人飞行棋小游戏

    文章目录 前言 项目结构流程图 项目实现 一.游戏开始界面 二.初始化游戏地图 三.绘制飞行棋地图 四.玩游戏具体逻辑 ① 创建两个玩家角色 ② 具体走到每个关卡触发的结果 ③ 判断胜利 ④ 回首调优 ...

  7. GitBook插件整理 - book.json配置

    目录 1. 配置概况 1.1. 全局配置 1.2. 插件列表 plugins 1.3. 插件属性配置pluginsConfig 2. 一些实用插件 2.1. back-to-top-button 回到 ...

  8. C#方法讲解——飞行棋画地图

    我们经过C#的学习,相比大家都已经知道包,类,方法的关系. 前面也已经和大家分享了方法和封装的好处,今天我们拿一个例子来聊一聊,方法,封装,和逻辑 首先这是我们的例子:飞行棋 首先,我们来看,这个游戏 ...

  9. typescript学习笔记1-tsconfig.json配置和变量类型声明

    一,tsconfig.json {// 编译器选项"compilerOptions": {/* 基本选项 */"target": "es5" ...

最新文章

  1. mpvue 转uniapp 导航栏样式错乱问题修复 tabbar 样式修复
  2. 总结open与fopen的区别
  3. WebAPi接口安全之公钥私钥加密
  4. centos修改磁盘uuid_CentOS 6如何修改磁盘配额限制
  5. Device eth0 does not seem to be present, delaying initialization.转载
  6. 【QM-06】Material Specification(物料说明)续
  7. linux 多线程实现倒计时,Linux用脚本实现“时分秒“倒计时功能
  8. Android源码解析--SwipeMenuListView仿QQ聊天左滑
  9. 在WinCE5.0和WinCE6.0下,编译选项介绍
  10. 【计算机网络复习】1.2.1 分层结构、协议、接口、服务
  11. 关闭Wordpress修订功能,清除“Revision”的方法
  12. Python学习笔记之文件
  13. 【Music】Never took the time
  14. matlab图例双字体设置
  15. 实战分享:如何通过黑帽SEO快速获取庆余年这类电视剧流量
  16. 猜游戏程序java_java猜字游戏
  17. Win64 驱动签名
  18. 软件测试——NextDay测试
  19. bilibili 哔哩哔哩 2018秋招试题
  20. 如何快速搭建一个像“天猫精灵”的智能语音助手?

热门文章

  1. AcWing 1101. 献给阿尔吉侬的花束【BFS】
  2. 第一台计算机有用到网络吗,怎么通过一台有网的电脑将另一台没网的电脑连接上网...
  3. onkeypress与onkeydown 事件区别详细说明
  4. Spring DAO(2):Spring JDBC 访问数据库
  5. android sdk location should not contain whitespace
  6. 缤特力m165连接ThinkPad-X250
  7. 汽车英语词汇 (2012了 大家抓紧学习)
  8. VOS 系统报错,系统挂断 VOS不通,各种vos疑难杂病都在这里
  9. 代理刷网页点击量-点到为止 2014-03-11 09:40
  10. 计算机不上电维修流程,电脑坏了自己怎么修,电脑维修流程