1. 程式人生 > >HTML5引擎Construct2技術剖析(二)

HTML5引擎Construct2技術剖析(二)

接上一節,在講解遊戲資料解析之前,需要先介紹一下游戲資料格式。
(另,本人也寫了一個基於C2引擎開發的遊戲編輯器,能夠匯出與Construct2相同格式資料檔案,發表在百度貼吧construct2吧 帖子地址為:http://tieba.baidu.com/p/3629460539

遊戲資料檔案格式

使用Construct2開發HTML5遊戲,不需要寫一行js程式碼,匯出遊戲時,編輯器中的關卡場景和事件表單的所有遊戲資料全部儲存在data.js檔案中,資料採用json格式來組織,下面就分類介紹json格式中各個欄位的含義(需要說明的是,有少量的欄位的含義還沒有弄清楚,可能會有個別字段含義理解錯誤,歡迎指正)

ProjectModel

一個遊戲對應一個工程模型,整個遊戲的資料模型採用ProjectModel資料格式來儲存,是一個數組Array物件(按索引順序來介紹各個欄位含義):

[0]: string,遊戲名
[1]: string, 第一個場景名, null表示預設
[2]: Array,Plugin(外掛)模型列表,具體格式詳見後面
[3]: Array,ObjectType(物件型別)模型列表,具體格式詳見後面
[4]: Array,Family(集合)模型列表,具體格式詳見後面
[5]: Array,Layout(介面)模型資料,具體格式詳見後面
[6]: Array,EventSheet

(事件單)資料,具體格式詳見後面
[7]: Array,預載入的音訊資料列表,是一個2維陣列,陣列單元格式為
—[0]: string, 音訊檔名;
—[1]: number,檔案大小(位元組數目)
[8]: string,資原始檔相對目錄
[9]: bool,是否採用畫素對齊
[10]: number,原始設計寬度
[11]: number,原始設計高度
[12]: number,全屏模式,0 = off, 1 = crop(影象顯示比例不隨視窗大小變化,視窗越大顯示的場景越多), 2 = scale inner(保持原始長寬比進行縮放,與視窗長寬比不一致時會裁掉部分場景), 3 = scale outer(保持原始長寬比進行縮放,與視窗長寬比不一致時會顯示更多場景添補黑邊;主要用於不支援縮放,但是支援多種解析度), 4 = letterbox scale(保持原始長寬比,與視窗長寬比不一致時會出現黑邊), 5 = integer letterbox scale(縮放模式與letterbox scale相同,但是縮放比例必須是整數倍)
[13]: bool,是否開啟3D加速
[14]: bool,是否開啟線性取樣
[15]: bool,是否支援背景alpha
[16]: string,版本字串
[17]: bool,是否使用高Dpi模式
[18]: bool,load螢幕是否採用Layout佈局(如果為真,則第一個場景佈局就是載入介面的佈局)
[19]: number,loading螢幕顯示風格,0=顯示載入logo圖片,1=顯示進度條, 2=文字顯示載入百分比)
[20]: number,顯示方向, 0 = any任意, 1= portrait豎屏, 2 = landscape橫屏)
[21]: number,下一個UID
[22]: bool,遊戲暫停時螢幕變模糊
[23]: bool,全屏縮放顯示質量, false =低質量, true =高質量
[24]: number,縮小顯示質量(縮放比例小於1),0 = low (關閉mipmaps), 1 = medium (開啟mipmaps, dense spritesheet), 2 = high (開啟mipmaps, sparse spritesheet)
[25]: number,是否預載入聲音檔案,0 =否, 1 =是
[26]: string,遊戲專案名
[27]: Array,Container
(容器)資料列表,具體格式詳見後面

Plugin資料格式

Plugin表示遊戲用到的外掛列表,是一個數組物件:

[0]:number,外掛索引(在objectRefTable表中的索引),
[1]:bool,全域性唯一
[2]:bool,是否在遊戲世界中出現
[3]:bool,是否具有位置屬性(用於add_common_aces函式向system_object物件新增相關的Cnds(條件)、Acts(動作)、Exps(表示式)函式)
[4]:bool,是否具有大小屬性(用於add_common_aces函式,作用類似)
[5]:bool,是否具有角度屬性(用於add_common_aces函式,作用類似)
[6]:bool,是否具有展現屬性(用於add_common_aces函式,作用類似)
[7]:bool,是否具有深度屬性(用於add_common_aces函式,作用類似)
[8]:bool,是否具有特效屬性(用於add_common_aces函式,作用類似)
[9]:bool,是否每次tick需要重繪

ObjectType資料格式

ObjectType表示遊戲中用到的實體型別,用於建立相應的物件例項,是一個數組物件:

[0]:string,型別名稱
[1]:number,型別所屬的外掛原型在ObjectRef表中的索引
[2]:bool,是否為family
[3]:Array,內部例項變數SID陣列
[4]: number,包含的行為數目
[5]: number,包含的特效數目
[6]:Array,使用的紋理檔案資料,是一個數組物件:
—[0]:string,影象檔案相對路徑(相對於遊戲資源目錄)
—[1]: number,檔案大小(位元組)
—[2]: number,影象格式, 0表示RGBA8,1表示RGB8 ,2表示RGBA4,3表示RGB5_A1 ,4表示RGB565
[7]:Array,Animation(動畫)資料列表,具體格式詳見後面
[8]:Array,Behavior(行為)資料列表,是一個2維陣列,每個陣列單元格式為:
—[0]:string,行為名
—[1]: function, 行為物件建構函式
—[2]: number, sid(唯一標示)
[9]:false, 是否為全域性例項(即該型別的例項在退出Layout時不會刪除,例如玩家控制的精靈)
[10]:false, 是否在loading介面中
[11]:number, sid(唯一標示)
[12]:Array,Effect(特效)資料,預設提供的是混合渲染特效,也可以自定義特殊繪製效果,是一個長度為2的陣列,陣列單元格式為:
—[0]: string, 特效名稱
—[1]: string,特效型別名
[13]:Array,TilePoly資料(尚未弄清楚)
[14]:Array,外掛引數陣列 (如果是singleglobal物件)

Animation資料格式

Animation記錄一個事件變數,是一個數組物件:

[0]: string,動畫名稱
[1]: number,每秒播放幀數(一般不超過60幀)
[2]: false,是否無限迴圈播放
[3]: number,重複播放次數(在非無限迴圈的情況下)
[4]: number,當動畫結束時停留的幀號
[5]: bool,是否Ping-Pong模式(正向/反向交替播放),
[6]: number, sid(唯一標示)
[7]: Array,動畫幀列表,是一個2維陣列,陣列單元格式為:
—[0]: string,動畫幀檔案相對路徑(相對遊戲資源目錄)
—[1]: number,檔案大小(位元組數)
—[2]: number,在紋理檔案上X偏移
—[3]: number,在紋理檔案上Y偏移
—[4]: number,寬度,如果動畫檔案就包含一幀(即整個圖片為一個動畫幀),則為0
—[5]: number,高度,如果動畫檔案就包含一幀,則為0
—[6]: number,持續的幀數,預設為1
—[7]: number,原點X座標相對位置(取值0-1)
—[8]: number,原點Y座標相對位置(取值0-1)
—[9]:Array,自定義的錨點資訊,是一個2維陣列,陣列單元格式為:
——[0]: string,錨點名
——[1]: number, X座標相對位置(取值0-1)
—[2]: number, Y座標相對位置(取值0-1)
—[10]:Array,碰撞多邊形頂點列表,每2個值表示一個頂點的XY相對座標(相對於原點而且,而不是紋理檔案左上角)
—[11]: number,畫素格式, 0表示RGBA8,1表示RGB8 ,2表示RGBA4,3表示RGB5_A1 ,4表示RGB565

Family資料格式

若干個物件型別ObjectType可以組成一個Family, 向Family賦予特效、引數、行為等資料,當建立物件例項時,物件例項除了具有自身型別所有屬性外,還會加入所在Family中的屬性,其結構是一個變長陣列:

[0]: number,Family對應的物件型別索引(即在runtime.types_by_index陣列中的索引)
[1-n]: number,Family中包含的物件型別索引列表

需要說明,陣列長度可變,Family中包含n類物件,陣列總長度為n+1。Family中的物件必須屬於同一類外掛

Layout資料格式

Layout記錄一個完整介面的資料,是一個數組物件:

[0]: string,介面名稱
[1]: number,原始寬度
[2]: number,原始高度
[3]: bool,是否支援無限滾動
[4]: string,關聯的EventSheet名(只能關聯一個EventSheet)
[5]: number, sid(唯一標示)
[6]: Array,場景中的Layer(圖層)列表
[7]: Array,場景中不在world中(不可見)的例項列表
[8]: Array,場景中使用的特效列表

Layer資料格式

Layer記錄一個圖層的資料模型,是一個數組物件:

[0]: string,圖層名稱
[1]: number, 圖層在Layout中的順序索引(索引小的圖層先繪製)
[2]: number, sid(唯一標示)
[3]: bool,是否初始可見
[4]: Array,背景顏色,長度為3:
—[0]: number, 紅色
—[1]: number, 綠色
—[2]: number, 藍色
[5]: bool,是否透明
[6]: number,圖層在X座標方向的滾動速度倍數(相對正常速度)
[7]: number,圖層在Y座標方向的滾動速度倍數(相對正常速度)
[8]: number,透明度(取值0~1)
[9]: bool, 是否強制圖層渲染到臨時紋理上(即使在沒有特效情況下);如果圖層使用的特效,則會先繪製到臨時紋理上,然後在繪製到Canvas上
[10]: bool, 是否使用渲染網格,優化包含很多靜態物件的大圖層渲染
[11]: number,縮放比例
[12]: number,混合模式,
[13]: number,預設特效索引(當指定的特效無效或不存在時,則呼叫該特效替換)
[14]: Array,圖層中包含的Instance(物件例項)列表,,具體格式詳見後面
[15]: Array,圖層中包含的Effect列表,是一個2維陣列,陣列單元格式為:
—[0]: string,特效ID名
—[1]: string,特效型別名
—[2]: Array,引數列表,長度可變,與特效使用的引數數目一致

Instance資料格式

Instance記錄在圖層中的一個物件例項,是一個數組:

[0]: Array,物件預設例項的初始化資料,是一個數組(如果不是tilemap,則不要長度大於13,否則碰撞檢測有問題):
[0]:number,x座標
[1]:number,y座標
[2]:number,z座標
[3]:number,寬度
[4]:number,高度
[5]:number,深度
[6]:number,旋轉角度(弧度)
[7]:number,透明度
[8]:number,原點x座標
[9]:number,原點y座標
[10]:number,混合渲染模式
[11]:number,特效回撥函式索引(當指定特效無效時,使用該特效代替)
[12]:Array,特效引數陣列,如果特效無引數,則為空陣列
[13]: Array, TileMap格子資料,其格式如下
—[0] number,格子列數
—[1] number,格子行數
—[2] string,格子資料,採用合併方式,如果連續格子資料相同,例如0,0,則會處理為2x0
——[1]: number,物件型別索引(在runtime.types_by_index陣列中的索引)
——[2]: number, sid(唯一標示)
——[3]: Array,自定義引數資料,是一個2維陣列,陣列單元格式為:
———[0]:型別不確定,引數值
———[1]:string,引數名
——[4]: Array,行為屬性資料
——[5]: Array,插值屬性資料,與外掛定義順序一致

Container資料格式

Container記錄一個容器集合,是一個變長陣列,陣列元素是物件型別索引;每個物件型別只能屬於1個容器;

下一個節詳見介紹事件表單(EventSheet)資料格式