Resource Management - R32/heaps GitHub Wiki
heaps 带有完善的资源管理框架。
资源是指的用来创建游戏的图片, 材质, 音乐文件, 3D模型等等
资源的访问可以通过直接访问 hxd.Res
类的静态成员,例:
var tile = hxd.Res.myDirectory.myBitmap.toTile();
heaps 会自动扫描资源文件夹 res
(-D resourcePath=PATH/TO
定义的文件夹)。然后列出所有资源智能提示给 IDE。
资源的类型依赖于文件的扩展名,资源将被自动转换成相应的 Class, 参考如下:
png,jpg,jpeg,gif
: hxd.res.Imagewav,mp3,ogg
: hxd.res.Soundfbx,hmd
: hxd.res.Modelfnt
(+png): hxd.res.BitmapFontttf
: hxd.res.Fonttmx
: hxd.res.TiledMapatlas
: hxd.res.Atlas- other: hxd.res.Resource (still allows you to ready binary data)
资源加载器
hxd.Res
提供了资源的快捷访问,但是它并没有将资源挂载到资源文件系统,hxd.Res
提供了几种不同的挂载方式让你自已选择。例如你可以选择“嵌入” :
hxd.Res.initEmbed();
它其实和下边这行代码的形为是一样的 :
hxd.Res.loader = new hxd.res.Loader(hxd.fs.EmbedFileSystem.create());
之后你才能在 Heaps 的“资源文件系统”读取它们。
动态加载资源
有时候,我们需要计算出资源的相对路径,例:
for(i in 0...5)
hxd.Res.loader.load("png/avatar_" + i + ".png");
hxd.Res.loader.load
方法这将返回一个 hxd.res.Any 对象,它有着各种转换方法,可以根据不同的文件类型它可以转换成 Heaps 中相应的类。
运行时资源加载
同样可以在运行时加载外部资源,例如通过调用 hxd.net.BinaryLoader
。
一旦当你获得二进制资源,可以使用 hxd.res.Any.fromBytes
将它转换成 Any,再通过这个对象转换成你想要的资源类型。
文件系统
资源文件的访问是通过虚拟文件系统(实现了 FileSystem 接口。)。
Heaps 已经提供了下边几种文件系统:
-
EmbedFileSystem 访问的资源文件将被 嵌入 到你的代码(嵌入的细节在不同平台有所差异)。对于 Javascript 平台,代码和资源将全都存储在单独的同一个 js 文件中。
-
LocalFileSystem 使用本地文件系统的方式访问资源。这需要能正常访问 Sys 包的平台,因为它依赖于文件系统的访问。例如: flash air, cpp 中允许访问文件系统,但在基于浏览器的 js 或 flash 平台中则无效。
-
hxd.fmt.pak.FileSystem 这个文件系统将从
.pak
包文件中读取资源。PAK 包文件可以在运行时加载。并且可使用多个 PAK 包文件(最后加载进来的 PAK 包内的文件将会覆盖掉先前 PAK 包中同名的文件。这种覆盖方式非常适合打补丁)
你可以自由选择初使化这些资源挂载方式:
-
hxd.Res.initEmbed()
对应 EmbedFileSystem,这个方法有可选参数,但由于是宏方法,参数不能是变量。 -
hxd.Res.initLocal()
对应 LocalFileSystem -
hxd.Res.initPak()
对应用于 PAK FileSystem - 将从本地文件系统依次加载 res.pak, res1.pak, res2.pak, 等等,直到找不到 resN.pak 文件
PAK 打包
你可以使用下边命令将资源文件夹(默认为 res)打包成 pak
文件
haxelib run heaps pak
细节可参考 hxd/fmt/pak/Build.hx
的源码
PAK 运行时加载
如果你想要使用“进度条”来显示 PAK 文件加载进度,可以重写 hxd.App 类的 loadAssets
方法,类似于:
class Game extends hxd.App {
override function init() {
trace("PAK is ready!");
}
override function loadAssets(onLoaded) {
new hxd.fmt.pak.Loader(s2d, onLoaded);
}
public static function main() {
new Game();
}
}
是不是太简单了呢? loadAssets
将会在 .init()
之前调用,这时 update()
和 onResize
还不会被触发。
注:
hxd.fmt.pak.Loader
目前仅支持 flash 平台,但不包括 flash air如果你想在 flash air 中从网络上加载 PAK 文件,可以使用
hxd.net.BinaryLoader
,由于 flash air 的 FileSystem 是属于 “本地文件系统”因此你需要先把 Bytes 保存到本地,然后再调用
hxd.Res.loader.fs.loadPak(path)