HTML5引擎Construct2技术剖析
Posted 伪装狙击手
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)数据格式
以上是关于HTML5引擎Construct2技术剖析的主要内容,如果未能解决你的问题,请参考以下文章