---
# System prepended metadata

title: cocos-csd-parser
tags: [TMD, Cocos2D-X]

---

# cocos-csd-parser

## 起源
手key各個元件與索引它們實在是蛋疼
所以寫了小工具協助生成csd的class與Properties

邏輯與介面分開
熱重載比較好處理(不重開直接Reload code)

## 已實作功能
* 變數重名更名
    * 元件名稱轉變數  如果重名則會加-n
* 變數名稱調整
    * 如果非法名稱會調整成合法變數名稱
* ~~忽略特定元件~~ 目前有BUG
    * 元件名稱為@開頭則不會被列入enum內
* 邏輯與元件索引文件分離
    * 方便將來更新索引規則 更新只要覆蓋掉Properties
* 自動放置
    * 如果csd是在project內 則會依照規則將lua生成到對應的資料夾內  不用再手動複製 
    * 如果找不到對應資料夾則會詢問該如何處理
    * ![image](https://hackmd.io/_uploads/Skry9zNoA.png =10%x)Config設定InannaLua位置
    ![image](https://hackmd.io/_uploads/rJG2YzEsA.png)
    ![image](https://hackmd.io/_uploads/B1N6FG4oA.png)


* require
    * class會自動require properties 不用再自行輸入路徑
        * 目前有遇到路徑大小寫問題 如果load不到 得檢查一下路徑大小寫
    * properties支援require要用到的lua檔
* animation初始化與AnimationKeys 生成
* ![image](https://hackmd.io/_uploads/By2WszEjA.png =5%x)~~自動button事件綁定初始化~~
    ~~* 添加事件進[ButtonEvents](#ButtonEvents)~~
    * 改使用[ButtonHelper](https://hackmd.io/@Hs005SbpR4yt-SGz7u4FSw/ryjHjM4jR)綁點擊事件
* 將來擴充性調整
    * ~~利用反射讓以後擴充生成規則不會影響到其他程式碼~~ 不知道當初在寫三小
    * 降低CocosStudio調整Hiearachy對程式碼的影響
    * 刪除或更名節點目前無法自動校正
* editbox自動生成
    * 元件名字含有'editbox'的話 會自動轉成[EditoBoxProxy](https://hackmd.io/@Hs005SbpR4yt-SGz7u4FSw/HyJHrJfGC)

## 元件命名規則
* @xxxxx
    * 忽略生成該元件的enum與變數
* -editbox-
    * 不考慮大小寫
    * 名字內含有此關鍵字 則會轉成editbox

## 關係
![csd-parser.drawio (1)](https://hackmd.io/_uploads/ByYd523-R.png)
利用View的csd生成對應的View.lua和ViewProperties.lua
需要使用該Properties的view就自行Require並呼叫Bind綁定元件
之後藉由m_properties取需要的元件即可(如下圖)
![image](https://hackmd.io/_uploads/r11yXhhWC.png)

### View.lua
會有基本function
記得確認一下路徑
![image](https://hackmd.io/_uploads/r1Z6GybGC.png)

請參考[UIManager.IUIView](https://hackmd.io/@Hs005SbpR4yt-SGz7u4FSw/Bkv-6MEsR#IUIView)

### ViewProperties.lua
結構會分成
* Enum: AnimationKeys
    * animation keys
* Enum: NodeNames
    * 元件列表
* Bind: Function
    * 元件索引以及事件綁定
* 
只會有一個function - Bind
負責給外部呼叫去關聯元件
![image](https://hackmd.io/_uploads/Byjys3nZC.png)


## 使用方法
拖曳csd丟進exe
![image](https://hackmd.io/_uploads/r1g5mhnbC.png)
* 可一次拖曳多個
* 產生的lua檔會跟對應的csd生成在同一個資料夾

### 新介面製作
生成好後把lua檔丟到對應的位置

### 舊介面調整
把新產的Properties.lua覆蓋掉原本的Properties就好

## ButtonEvents
Button類別的元件會在 'self.m_props.buttonEvents' 底下自動產生對應的事件
如果要使用的話
可以在Ctor內綁定事件
![image](https://hackmd.io/_uploads/rJXmRmff0.png)


~~[載點](https://drive.google.com/file/d/1M5PryBgiDdod4nYc0XXZHtKjo8kkANGY/view?usp=drive_link)~~

目前放在Inanna/Tools/CSDParser裡面