-
Notifications
You must be signed in to change notification settings - Fork 796
Using Resource System
Egret提供了一套默认的资源加载管理模块,在"RES"这个命名空间下。RES是一个可选的模块,与Egret核心库完全独立。开发者可以自行选择是否采用它,或使用自定义的第三方资源加载管理库。
这里我们以Egret模板项目的resource.json为例:
{
"resources": [ {"name":"bgImage","type":"img","url":"assets/bg.jpg"}, {"name":"egretIcon","type":"img","url":"assets/egret_icon.png"}, {"name":"description","type":"json","url":"config/description.json"} ],
"groups": [ {"name":"preload","keys":"bgImage,egretIcon"} ] }
resources下是每一项资源的配置信息,name表示这个资源的唯一短名标识符,type表示资源类型,url是资源文件的路径。
groups下是预加载资源组的配置,每项是一个资源组。name表示资源组的组名,keys表示这个资源组包含哪些资源,里面的逗号分隔的每一个字符串,都与resources下的资源name对应。同一个资源可以存在于多个资源组里。调用RES.loadConfig()加载之前的resource.json配置文件即可完成初始化。loadConfig()第一个参数是resource.json文件的完整路径,第二个参数是resource.json里每个资源项url的前缀。例如配置里的bgImage资源项填的url是assets/bg.jpg,在这里实际加载时将会采用resources/assets/bg.jpg来加载:
RES.addEventListener(RES.ResourceEvent.CONFIG_COMPLETE,this.onConfigComp,this); RES.loadConfig("resources/resource.json","resources/");
若需要在初始化完成后再做一些处理,监听ResourceEvent.CONFIG_COMPLETE事件即可。
注意:RES.loadConfig()通常应写在整个游戏最开始初始化的地方,并且只执行一次。
在配置文件加载完成后,我们可以调用RES.loadConfig()开始预加载配置中的一组资源。第一个参数"preload"对应配置文件中的资源组名。预加载可以在游戏启动时,也可以是某个面板被打开前,调用时机由具体项的目逻辑确定:
RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onResourceLoadComplete,this);
RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS,this.onResourceProgress,this); RES.loadGroup("preload");
这里需要注意下组加载事件回调函数里的写法,需要使用event.groupName判断下这个事件是属于哪个资源组,因为可能有多个资源组同时在加载:
private onResourceProgress(event:RES.ResourceEvent):void {
if(event.groupName=="preload"){
this.loadingView.setProgress(event.itemsLoaded,event.itemsTotal);
}
}
若同时启动多个资源组一起加载,比如在加载"preload"前,我们希望先加载一个更小的"loading"资源组,以提供显示"preload"组加载进度的素材,可以使用RES.loadGroup()的第二个参数,为"loading"组传入一个优先级更大的数字,来迫使loading组在preload前加载完成:
RES.loadGroup("loading",1); RES.loadGroup("preload",0);
若资源组无法预先配置在文件中,需要运行时才能动态确定的,我们可以通过调用RES.createGroup(name:string,keys:Array)方法,动态创建一个资源组,再加载它。
RES一共含有三种资源获取方式:
-
RES.getRes(name:string):any
同步获取资源 这种方式只能获取已经缓存过的资源,例如之前调用过loadGroup()被预加载的资源。 -
RES.getResAsync(name:string,compFunc:Function,thisObject:any):void
异步获取资源,这种方式可以获取配置中含有的所有资源项。如果缓存中存在,直接调用回调函数返回,若不存在,就启动网络加载文件并解析后回调。 -
RES.getResByUrl(url:string,compFunc:Function,thisObject:any,type:string=""):void
通过url获取不在配置中的资源,通常不建议使用这个接口,只有那些不合适填写在配置中,比如获取网络上其他服务器的资源时,才采用这种方式。
目前RES内置支持的文件类型有:
RES.ResourceItem.TYPE_IMG: RES.ResourceItem.TYPE_IMG: RES.ResourceItem.TYPE_IMG:
public static TYPE_BIN:string = "bin";
/**
* 文本文件(解析为字符串)
*/
public static TYPE_TXT:string = "txt";
/**
* JSON文件
*/
public static TYPE_JSON:string = "json";
/**
* SpriteSheet文件
*/
public static TYPE_SHEET:string = "sheet";
/**
* BitmapTextSpriteSheet文件
*/
public static TYPE_FONT:string = "font";
public static TYPE_SOUND:string = "sound";
如果您有任何疑问或建议,欢迎访问 Egret开发者论坛 和 Egret 官方团队讨论