Skip to main content

资源管理

游戏中所用到的所有资源都会放在资源管理器中进行管理,在使用资源之前需要将资源添加到资源管理器中,并为资源设置一个资源名,在需要时直接使用资源名。这样做的好处:

  • 统一资源入口管理。
  • 在 Eva.js 加载资源时,资源管理器可以对资源进行预处理,减少运行时处理资源产生卡顿等问题

添加资源

import { RESOURCE_TYPE, resource } from '@eva/eva.js'

下面列举了最常使用的几种资源

图片

{
name: "image",
type: RESOURCE_TYPE.IMAGE,
src: {
image: {
type: "png",
url: "//gw.alicdn.com/bao/uploaded/TB1lVHuaET1gK0jSZFhXXaAtVXa-200-200.png"
}
},
}

龙骨动画

{
name: "dragonBone",
type: RESOURCE_TYPE.DRAGONBONE,
src: {
ske: {
type: "json",
url: "//gw.alicdn.com/bao/uploaded/TB1SFUHVAzoK1RjSZFlXXai4VXa.json",
},
tex: {
type: "json",
url: "//gw.alicdn.com/bao/uploaded/TB17n.IVrrpK1RjSZTEXXcWAVXa.json",
},
image: {
type: "png",
url: "//gw.alicdn.com/bao/uploaded/TB11W7FVyrpK1RjSZFhXXXSdXXa-489-886.png"
},
},
}

spine 动画

{
name: "spineAnimation",
type: RESOURCE_TYPE.SPINE,
src: {
ske: {
type: "json",
url: "//gw.alicdn.com/bao/uploaded/TB1SFUHVAzoK1RjSZFlXXai4VXa.json",
},
atlas: {
type: "json",
url: "//gw.alicdn.com/bao/uploaded/TB17n.IVrrpK1RjSZTEXXcWAVXa.atlas",
},
image: {
type: "png",
url: "//gw.alicdn.com/bao/uploaded/TB11W7FVyrpK1RjSZFhXXXSdXXa-489-886.png"
},
},
}

实际项目中可能需要一次性添加很多资源,可以通过 addResource  实现这一目的

import { RESOURCE_TYPE, resource } from '@eva/eva.js'

resource.addResource([
{
name: 'img1',
type: RESOURCE_TYPE.IMAGE,
src: {
image: {
type: 'png',
url: '//gw.alicdn.com/bao/uploaded/TB1lVHuaET1gK0jSZFhXXaAtVXa-200-200.png'
}
}
}
// other resources
])

资源预加载

使用 preload() 方法将资源列表中 preload 为 true 的资源进行加载,可以通过监听 resource 上的事件来获取当前加载进度,适合在游戏初始化展示 loading,切换场景时请求资源时使用。

resource.on(LOAD_EVENT.START, () => {}) // 开始loader
resource.on(LOAD_EVENT.PROGRESS, () => {}) // 加载进度更新
resource.on(LOAD_EVENT.LOADED, () => {}) // 某文件加载成功
resource.on(LOAD_EVENT.COMPLETE, () => {}) // 加载完成
resource.on(LOAD_EVENT.ERROR, () => {}) // 某文件加载失败
resource.preload()

获取资源

getResource(resourceName)

使用 getResource 方法获取资源,该方法返回的是一个 promise。资源将会存在于 data 属性中,如果资源是 JSON 文件,则 data 的值是一个 js 对象;如果资源是图片,则 data 的值将会是 Image 实例。

resource.getResource('img1').then(res => {
const name = res.name // 资源名称
const data = res.data // 资源中文件对应的内容 json 或者 img 等
const instance = res.instance // 处理后的实例
})

loadSingle(resource)

使用 loadSingle 来加载单个资源,不需要将资源添加到 addResource 里面,该方法返回的是 promise。

resource
.loadSingle({
name: 'img1',
type: RESOURCE_TYPE.IMAGE,
src: {
image: {
type: 'png',
url: '//gw.alicdn.com/bao/uploaded/TB1lVHuaET1gK0jSZFhXXaAtVXa-200-200.png'
}
},
preload: true
})
.then(res => {})

资源处理

通过为某种类型的资源注册方法,可以在资源请求回来时对资源进行处理,在使用时可以直接获取到资源实例。

resource.registerInstance(RESOURCE_TYPE.SPRITE, async ({ name, data }) => {
const instance = await instanceSth(data)
return instance
})

资源销毁

资源可以主动销毁,需要要注意的是,在销毁资源前要确保游戏中没有使用该资源。

resource.destroy('img1')

如果为该类型资源注册了销毁方法,则会调用该方法销毁资源。

resource.registerDestroy(RESOURCE_TYPE.SPRITE, async ({ instance }) => {
await instance.destroy()
})

加载超时事件设置

resource.timeout = 30000