关键词
路径目录脚本闭包动态加载回调方法资源对象类型转换资源加载资源动态
动态加载资源
下边我们来看一下资源的动态加载,在 cocos 里边资源的加载有两种方式,一种称之为静态加载,另外一种就是动态加载。我们之前所学的方式都算是静态加载,比如有一个资源图片放在 texture 目录下边,添加一个图片的节点,而这个节点里边有一个 sprite 这个组件,里边有一个 spriteframe 属性,图片拖入组件属性中,这个称之为引用关系,也就是节点引用了图片资源。
当这个游戏启动的时候,由游戏引擎把这个场景里边所有的节点给加载进来,节点所引用的这些图片也都会被自动的加载进来,这个是不需要我们操心的,称之为静态加载。
还有另外一种方式称为动态加载,就是使用代码的方式,使用它提供的一个 API 叫做** cc.resources.load**
,使用这个方式可以在代码运行的时候动态的加载资源。
实现效果是当点击图片的时候,动态加载一个资源图片进来。
当点击这个节点的时候,我们会在这里边使用动态加载的方式,调用 cc.resource.load 把一个资源图片加载进来,得到了一个frame 对象,直接把它设置给当前的这个sprite就可以了。
我们重点看一下 cc.resource.load是怎么样来用的,为什么它可以把一个图片给加载进来,重点理解一下这段代码是什么意思,这个细节还是很多的。
首先这个方法的原型看一下, cc.resource.load 带三个参数,第一个参数叫 path ,在这里边,我们指定路径是 icon /汽车。这是它规定的一种写法。
首先所有动态加载的资源都必须建立在一个叫做 resources 的目录下边,这个名字是不能改的,是固定不变的,把要加载的资源放在这里边,比如放一个 icon 的目录,在下面放一个汽车,在加载的时候,我们只需要把这个相对路径写下来就可以了。所以这是第一点就是必须要放在 resource 下边,第二点资源名是没有后缀的。
第二个参数,要加载图片的话,那就是 cc.spriteframe,如果是声音的话,应该是 cc.audioclip,这个是可以省略的,可以不填直接写第三个参数。
第三个参数是一个回调方法,就是当游戏引擎把资源动态加载进来之后,得到了一个资源对象叫 assets ,前面还有个参数叫 error, error 表示的是有没有成功。如果 error 等于null 的话表示已经成功了,如果 error 不是 null 的话就表示出错的原因。
所以在这里边我们可以一个加一行检测,比如说你可以在这里边将这么样一个检测,如果它不等于null的话表示出错了,这时候就 return 你可以把日志给加载进来。
还有一些语法细节,比如这里边为什么不用 this ,比如说我在这里边直接加上 this.node.getComponent 不就行了,这样写是不行的,因为在回调方法里边找不到this这个对象,这是一个回调方法。那按照这个 javascript 一般写法,前面定一个临时变量指向 this ,然后这里边用这个变量self就可以了。这种语法叫闭包 ,这是JavaScript里边的一种写法,闭包说可以访问外部的方法里边定的局部变量的意思。
另外还有一个类型转换的语法,这里边为什么有个尖括号,在 TypeScript 表示的是类型转换 ,assets 它的类型其实是 cc.assets 类型。我们这里边需要的是 frame 类型,所以要把这个类型转换一下,不然的话VSCode 会给我们错误提示的。你如果不这么写的话,它提示我们无法进行转换。 所以我们加上一个显示的类型转换。