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, 参考如下:

   

资源加载器

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)