dragonbones-runtime
Version:
the tools to build dragonbones file for diffrent framework
248 lines (231 loc) • 9.44 kB
text/typescript
//////////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2014-present, Egret Technology.
// All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the Egret nor the
// names of its contributors may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//////////////////////////////////////////////////////////////////////////////////////
namespace RES {
/**
* @class RES.ResourceConfig
* @classdesc
* @private
*/
export class ResourceConfig {
public constructor() {
RES["configInstance"] = this;
}
/**
* 根据组名获取组加载项列表
* @method RES.ResourceConfig#getGroupByName
* @param name {string} 组名
* @returns {Array<egret.ResourceItem>}
*/
public getGroupByName(name:string):Array<ResourceItem> {
let group:Array<ResourceItem> = new Array<ResourceItem>();
if (!this.groupDic[name])
return group;
let list:any[] = this.groupDic[name];
let length:number = list.length;
for (let i:number = 0; i < length; i++) {
let obj:any = list[i];
group.push(this.parseResourceItem(obj));
}
return group;
}
/**
* 根据组名获取原始的组加载项列表
* @method RES.ResourceConfig#getRawGroupByName
* @param name {string} 组名
* @returns {any[]}
*/
public getRawGroupByName(name:string):any[]{
if (this.groupDic[name])
return this.groupDic[name];
return [];
}
/**
* 创建自定义的加载资源组,注意:此方法仅在资源配置文件加载完成后执行才有效。
* 可以监听ResourceEvent.CONFIG_COMPLETE事件来确认配置加载完成。
* @method RES.ResourceConfig#createGroup
* @param name {string} 要创建的加载资源组的组名
* @param keys {egret.string[]} 要包含的键名列表,key对应配置文件里的name属性或sbuKeys属性的一项或一个资源组名。
* @param override {boolean} 是否覆盖已经存在的同名资源组,默认false。
* @returns {boolean}
*/
public createGroup(name:string, keys:string[], override:boolean = false):boolean {
if ((!override && this.groupDic[name]) || !keys || keys.length == 0)
return false;
let groupDic:any = this.groupDic;
let group:any[] = [];
let length:number = keys.length;
for (let i:number = 0; i < length; i++) {
let key:string = keys[i];
let g:any[] = groupDic[key];
if(g){
let len:number = g.length;
for(let j:number=0;j<len;j++){
let item:any = g[j];
if (group.indexOf(item) == -1)
group.push(item);
}
}
else{
let item = this.keyMap[key];
if (item){
if(group.indexOf(item) == -1)
group.push(item);
}
else{
egret.$warn(3200, key);
}
}
}
if (group.length == 0)
return false;
this.groupDic[name] = group;
return true;
}
/**
* 一级键名字典
*/
private keyMap:any = {};
/**
* 加载组字典
*/
private groupDic:any = {};
/**
* 解析一个配置文件
* @method RES.ResourceConfig#parseConfig
* @param data {any} 配置文件数据
* @param folder {string} 加载项的路径前缀。
*/
public parseConfig(data:any, folder:string):void {
if (!data)
return;
let resources:any[] = data["resources"];
if (resources) {
let length:number = resources.length;
for (let i:number = 0; i < length; i++) {
let item:any = resources[i];
let url:string = item.url;
if(url&&url.indexOf("://")==-1)
item.url = folder + url;
this.addItemToKeyMap(item);
}
}
let groups:any[] = data["groups"];
if (groups) {
let length = groups.length;
for (let i = 0; i < length; i++) {
let group:any = groups[i];
let list:any[] = [];
let keys:string[] = (<string> group.keys).split(",");
let l:number = keys.length;
for (let j:number = 0; j < l; j++) {
let name:string = keys[j].trim();
let item = this.keyMap[name];
if (item && list.indexOf(item) == -1) {
list.push(item);
}
}
this.groupDic[group.name] = list;
}
}
}
/**
* 添加一个二级键名到配置列表。
* @method RES.ResourceConfig#addSubkey
* @param subkey {string} 要添加的二级键名
* @param name {string} 二级键名所属的资源name属性
*/
public addSubkey(subkey:string,name:string):void{
let item:any = this.keyMap[name];
if(item&&!this.keyMap[subkey]){
this.keyMap[subkey] = item;
}
}
/**
* 添加一个加载项数据到列表
*/
private addItemToKeyMap(item:any):void{
if(!this.keyMap[item.name])
this.keyMap[item.name] = item;
if(item.hasOwnProperty("subkeys")){
let subkeys:any[] = (<string><any> (item.subkeys)).split(",");
item.subkeys = subkeys;
let length:number = subkeys.length;
for(let i:number = 0;i < length;i++){
let key:string = subkeys[i];
if(this.keyMap[key]!=null)
continue;
this.keyMap[key] = item;
}
}
}
/**
* 获取加载项的name属性
* @method RES.ResourceConfig#getType
* @param key {string} 对应配置文件里的name属性或sbuKeys属性的一项。
* @returns {string}
*/
public getName(key:string):string{
let data:any = this.keyMap[key];
return data?data.name:"";
}
/**
* 获取加载项类型。
* @method RES.ResourceConfig#getType
* @param key {string} 对应配置文件里的name属性或sbuKeys属性的一项。
* @returns {string}
*/
public getType(key:string):string {
let data:any = this.keyMap[key];
return data ? data.type : "";
}
public getRawResourceItem(key:string):any{
return this.keyMap[key];
}
/**
* 获取加载项信息对象
* @method RES.ResourceConfig#getResourceItem
* @param key {string} 对应配置文件里的key属性或sbuKeys属性的一项。
* @returns {egret.ResourceItem}
*/
public getResourceItem(key:string):ResourceItem {
let data:any = this.keyMap[key];
if (data)
return this.parseResourceItem(data);
return null;
}
/**
* 转换Object数据为ResourceItem对象
*/
private parseResourceItem(data:any):ResourceItem {
let resItem:ResourceItem = new ResourceItem(data.name, data.url, data.type);
resItem.data = data;
return resItem;
}
}
}