资源加载
Cocos资源的加载,有两种方式:
- 静态加载
直接在属性管理器指定,在节点被加载时一并加载 - 动态加载
在脚本中,使用代码 cc.resources.load () 运行时加载,实现方法:
onClicked(){
let self = this; // 这是JS中的闭包语法
cc.resources.load("icon/汽车", cc.SpriteFrame, function (err, assets) {
self.node.getComponent(cc.Sprite).spriteFrame = <cc.SpriteFrame> assets;//类型转换
});
}
实现如下效果,点击切换图片
方法原型:cc.resources.load( path, type, onComplete)
参数:
- 第1个参数: path
表示要加载的资源的路径
例如,icon/汽车 指的是 assets/resources/icon/汽车
待加载的资源必须放在resources目录下,会在该文件夹内自动导出
路径不能加后缀名 - 第2个参数:type
指定资源对象类型,可以省略 cc.SpriteFrame , cc.AudioClip - 第3个参数:onComplete
指定回调方法,当资源加载完毕时调用
function( err, assets ) {
}
若err == null ,表示资源加载成功,assets即为加载得到的资源对象
若err!=null ,表示资源加载出错,err即为出错的原因。 - assets是cc.Asset类型,需要使用类型转换:
- 注意回调函数无法访问this
闭包
在上述函数的onComplete参数的函数中,使用的为回调方法(在A函数中将B函数的指针作为参数或者匿名函数作为函数参数,此时B函数叫做回调方法)
无法访问this指针,需要用函数内的临时变量导入
加载多个资源
可以一次性的加载多个资源,有两个办法:
- 指定多个资源路径
cc.resources.load ( paths, callback(err, assets){ … })
其中,paths类型 [cc.String], assets类型 [cc.Asset] - 指定一个资源目录
cc.resources.loadDir(path , callback(err,assets){ … })
其中,path是一个文件夹路径,assets是[cc.Asset]
frames : cc.SpriteFrame[] = new Array();
sprite : cc.Sprite = null; // Sprite组件
index : number = 0; // 当前显示第N张图片
interval : number = 0.1; // 定时器的间隔
onLoad () {
this.sprite = this.getComponent(cc.Sprite);
// 动态加载一个目录下的所有资源
let self = this;
cc.resources.loadDir("飞羽gif/", cc.SpriteFrame, function (err, assets :[cc.SpriteFrame]) {
self.frames = assets;
});
}
start () {
this.schedule(this.onTimer, this.interval);
}
onTimer(){
if(this.frames.length ==0) return;
this.sprite.spriteFrame = this.frames[this.index];
// 下一帧
this.index ++;
if(this.index >= this.frames.length)
this.index = 0;
}
// update (dt) {}
onDestroy(){
this.unschedule(this.onTimer);
}
逻辑基本同Gif图片、动画加载的流程,只是资源获取的方式不同。
链接: 官方手册介绍.