现在我们有2种类型的怪物,而且创建的时候是写死在代码里的,这是要作死的节奏~
所以,必须可配置,不然会累死人的。
笨木头花心贡献,啥?花心?不呢,是用心~
转载请注明,原文地址: http://www.benmutou.com/blog/archives/949
文章来源:笨木头与游戏开发
什么是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文件,我们就用别人已经写好的库,说库太高深了,就是一些h和cpp文件。
我使用的是JsonCpp库,大家可以到这里下载:http://download.csdn.net/detail/musicvs/7392931
下载好后,解压json文件夹到项目的Classes目录下,然后就像导入代码文件一样导入到项目中就可以了。如图:
好,这次真的是最后一步了,我们修改Monster的init函数:
有点小复杂,没关系,你们自己理解理解就好了…啊才怪啊,怎么可能!(小若:抢我台词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顶部加上:
然后,编译运行,效果和之前是一样的,证明我们已经成功。
PS:有人反馈Json库编译报一堆错误,试试以下操作:
项目属性,【C/C++】->【常规】->【附加包含目录】,看看”..Classes”这一条有没有加上去,并且是不是在第一条,把它放在第一条试试。
也许大家要喷了,各种疑问:
1. 为什么读取一个配置文件就这么复杂,这么多部分,那不是很麻烦?
答:因为这是实例教程,不想涉及太多的东西,所以我就尽量没有去封装了,在完整版里我是封装了一个JsonData类的,解析Json文件只需简单的一、两句话。
2. 每创建一个怪物对象,就要这样解析一次,岂不是很浪费效率?
答:效率浪不浪费我就没有去试验了,但是实际开发中肯定不会这样做的。在完整版的《别救我》里,我是预先加载好怪物的配置文件,然后作为一个个对象(MonsterConfig)缓存起来,要使用的时候,直接根据怪物ID获取就可以了。不会每次都去解析Json。
总之,一切从简,点到即止,否则我这教程不知道得写到什么时候了。
最后完善一个功能点,主角和怪物的碰撞,很简单,不需要加东西。
OK,运行游戏,然后我已经把怪物全都撞没了~如图:
(小若:等等!刚刚发生了什么事情?)
刚刚大家被我弄昏了(邪恶),我们回到刚刚的时间…
最后完善一个功能点,主角和怪物的碰撞,很简单,不需要加东西。
修改一下TollgateScene的onContactBegin函数:
我们新增了一个else if分支,判断如果other是怪物的话,那就对玩家进行攻击(或者加血),碰撞怪物之后,怪物就消失。
OK,现在运行游戏,我们就可以用主角碰撞怪物,然后怪物消失。
同时主角的HP会不断变化(从日志中查看)。
在《别救我》完整版里,玩家的任务是让主角的血量为0,所以是不能碰撞那些会加血的怪物的。
而且怪物也不是碰一下就消失,有些要碰好几下。
总之,所以的这一切都能通过修改怪物的配置文件来实现,给怪物加属性配置字段,我们就能实现多种多样的功能。
同时,还能通过修改TiledMap关卡配置文件,给矩形对象添加更多属性,比如添加怪物出场时的推力属性,这样怪物出场的时候就会往某个方向喷射。(于是连飞机大战都能做出来,所以这个就靠想象力了)
我给大家看一个完整版的关卡配置:
蓝色的怪物在出场的时候是会往上飞的,看起来就像是飞机的子弹,很有意思的配置吧~
OK,《别救我》所有的核心功能已经完成,剩下的,就是各种开场动画、菜单、UI、关卡了。
记得把物理引擎的调试模式关掉,不然会一直有很多红色的线。
好了,《别救我》简化版游戏实例教程,到此结束。
希望多多少少能帮到大家。
如果对完整版感兴趣的,可以到我的淘宝店购买完整版源码,这是对我最好的物质支持~地址:果断要看看
如果对完整版不感兴趣的,又想支持我的(哎呀,大家太热情了我也不想的(害羞)),可以点击我博客右上方的的“支付宝捐赠”,随意一下~
虽然捐赠不能让我成为土豪,但是它是对我最好的精神支持~