#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文件。
    單個sheet的配置表.png

    多個sheet的配置表:output_object_monster.png

    多個sheet的配置表:output_object_monster_level.png

.lua格式的配表數據的設計

這里給出一個生成的結果,再解釋為何.lua配置成如此。

使用上圖中的object_monster.xls
通過生成工具,生成了如圖的數據結構:

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腳本

在它的基礎之上,我進行了針對性的修改。


結束

我們底層的數據框架搭建好了,工作和生活更加愉快起來了_~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容