#Cocos2dx手游开发#12 配表数据

序言

在游戏开发过程中,需要提供一套配置数据的解决方案。这套解决方案中,就包含了配表数据

有两种配表的形式我比较认可:

  1. 提供一个数据的在线管理平台,此平台提供了一套数据维护的解决方案
  2. 使用Excel表格,对数据进行配置

对于1而言,它对数据做了有效的保护,能够配置用户的权限,对于有保密需求的公司而言,是一个很好的选择。不足之处是,提供此套解决方案的成本过高。

对于2而言,基本没有开发的成本,维护人员在掌握了配表规则后,可以非常方便的使用,缺点是,数据的访问权限完全开放。

若未特别声明,本文所指的配表数据就是指Excel的.xls格式的配表数据,以及将其转换为程序所使用的.lua格式的配表数据

围绕着配表数据,本篇将从以下几个要点进行讲述:

  • .xls配表的需求分析
  • .xls配表的设计
  • .lua格式的配表数据的格式设计
  • .lua格式的配表数据的生成工具

.xls配表数据的需求分析

我们先来看看配置人员是如何配置.xls表格的:

  1. 导航到配置数据的文件夹路径
  2. 新建一份.xls表格,对其命名
  3. 打开.xls文件,能够设置属性字段配置属性数值
  4. 能够建立不同的sheet,每一个sheet能够配置是否导出.lua文件(.lua文件是提供给程序使用的文件)
  5. 使用导出工具,导出.lua文件,提供给相关人员使用

从配置的过程,我们分析并确定了我们需要完成的任务:

  1. 提供.xls配表的文件框架
  2. 提供.xls配表文件的命名规范
  3. 提供.xls配表文件的表格格式
  4. 提供.xls配表文件的导出配置
  5. 提供.xls配置文件导出到.lua的工具

.xls配表的设计

于是我们给出了我们的.xls配表的设计方案:

  • 配置人员在指定的文件夹xls下进行表格的配置
  • 此文件夹下只有.xls文件,不允许出现子文件夹,文件命名为[module1][_module2].xls,其中module1, module2为模块标识,如
文件夹 PATH 列表
卷序列号为 000E-EB46
C:.
└─xls
        example_building.xls
        object_monster.xls
        object_role.xls
        system_daily.xls

我们通过文件名,就可以方便的知道:
object模块下有子模块monsterrole的配置.
system模块有子模块daily的配置.

  • .xls配置格式
    example_building.xls为例
id name use_money use_food is_init defense args1 args2 args3 args4
i s i f b i ai af as ab
编号 名称 金钱消耗 食物消耗 是否初始化 防御 数组1 数组2 数组3 数组4
1 house 1000 2.33 TRUE 100 1;2;3 1.23;2;3.23 sdf;23e;s true;false;true
2 house2 123 336.2 TRUE 1;2;3 1.23;2;3.23 你好;你在哪 true;false
3 456 222.33665 FALSE 130 3;2;5;; 1.23;2;3.23 我在这里啊;你在那;呢 false;true
4 farm 100 220 FALSE 200 2;3 1.23;2;3.23 df;ssd;dd;dd
5 house5 22.1 2343;6;6;;;7 3;6.3;6;;;7 1.23;2;3.23 true;true
6 horse6 200 FALSE 333 2e;w;e;we false;false;false;false
Note:

第一行是属性字段名,可用的字符集为(英文字母+数字+下划线),满足通常意义下的变量命名规范
第二行是类型声明
第三行是备注——不导出到最后的数据中

  • 导出设置
    .xls文件中,我们将一个sheet命名为output_xxxx,那么在后续的导出工具中,就会得到一个名为xxxx.lua的文件,如果当前的.xls中,有多个以output_开头的sheet,那么就会导出多个对应的.lua文件。
    #Cocos2dx手游开发#12 配表数据_第1张图片
    单个sheet的配置表.png

    #Cocos2dx手游开发#12 配表数据_第2张图片
    多个sheet的配置表:output_object_monster.png

    #Cocos2dx手游开发#12 配表数据_第3张图片
    多个sheet的配置表:output_object_monster_level.png

.lua格式的配表数据的设计

这里给出一个生成的结果,再解释为何.lua配置成如此。

使用上图中的object_monster.xls
通过生成工具,生成了如图的数据结构:

#Cocos2dx手游开发#12 配表数据_第4张图片
object_monster.lua

我们导出的 object_monster.lua不但完整的保存了配置数据,还拥有对数据内容的一些访问接口,先来看看如何使用数据表

数据表加载
local CnfObjectMonster = require("object_monster")

打印表数据项个数
print(">>>> 数据项个数")
print(CnfObjectMonster.len())
输出
>>>> 数据项个数
3

属性访问
local printMonster = function(monsterID)
    local monsterName = CnfObjectMonster.name(monsterID)
    local monsterResName = CnfObjectMonster.res_name(monsterID)
    print(string.format(">>>> monster of id(%d), its name is %s, its resource name is %s", monsterID, monsterName, monsterResName))
    local monsterSkillList = CnfObjectMonster.skill_list(monsterID)
    print(">>>> 打印技能列表")
    monsterSkillList.walk(print)
    print(">>>> 技能列表长度")
    print(monsterSkillList.len())
end
local monsterID = 10001
printMonster(monsterID)
输出
>>>> monster of id(10001), its name is 哥布林小怪, its resource name is spine_small_goblin
>>>> 打印技能列表
1   101
2   102
>>>> 技能列表长度
2

访问ID列表
local ids = CnfObjectMonster.getIDList()
for k, v in ipairs(ids) do 
    print(k, v)
end 
输出
1   10001
2   10002
3   10003

全表遍历
CnfObjectMonster.walk(function(k, id)
    printMonster(id)
end)
输出
>>>> monster of id(10001), its name is 哥布林小怪, its resource name is spine_small_goblin
>>>> 打印技能列表
1   101
2   102
>>>> 技能列表长度
2
>>>> monster of id(10002), its name is 哥布林精英, its resource name is spine_elite_goblin
>>>> 打印技能列表
1   101
2   102
3   103
>>>> 技能列表长度
3
>>>> monster of id(10003), its name is 哥布林头领, its resource name is spine_boss_goblin
>>>> 打印技能列表
1   101
2   102
3   104
4   105
>>>> 技能列表长度
4

我们可以看到:.lua数据文件提供了非常便捷的属性访问接口、遍历接口,另一方面,对于真正的数据data,被屏蔽了对它的增加、减少或者修改它的任一内容的操作。

这样的数据结构,既提供了读取数据的接口,又屏蔽了针对数据的修改操作十分令人满意

.lua格式的配表数据的生成工具

关于这份工具,我使用的是:

Github上的一份开源python脚本

在它的基础之上,我进行了针对性的修改。


结束

我们底层的数据框架搭建好了,工作和生活更加愉快起来了_~

你可能感兴趣的:(#Cocos2dx手游开发#12 配表数据)