我目前正在编写游戏代码,并将所有外部文件存储在 zip 文件中以节省空间。
我正在尝试使用 Fzip 从 Zip 文件中加载图像并将其显示在舞台上,但我没有运气。
FZip 网站 - http://codeazur.com.br/lab/fzip/ 示例 1 站点 - http://www.tuicool.com/articles/7VfQr2
我已经加载了 zip 文件并返回其中的文件数量,但我不知道如何检索名为“test.png”的图像。
import deng.fzip.FZip;
import deng.fzip.FZipFile;
import deng.fzip.FZipLibrary;
import flash.display.*;
var zip:FZip = new FZip();
var loaderzippy:Loader = new Loader();
function unzipObb():void {
zip.load(new URLRequest("file://"+File.applicationStorageDirectory.nativePath+"/cake2.zip"));
zip.addEventListener(Event.OPEN, onOpen);
zip.addEventListener(Event.COMPLETE, dosomething); }
function dosomething(evt:Event):void {
trace("dosomething");
var img_file:FZipFile = zip.getFileByName("test.png");
var loaderzip:Loader = new Loader();
loaderzip.loadBytes(img_file.content);
var image:Bitmap = Bitmap(loaderzip.content);
addChild(image); }
我刚刚返回#2007:参数 child 必须为非空。
任何帮助都会很棒。谢谢。
当您使用
loaderzip.loadBytes()
加载 PNG 字节时,您需要一个事件侦听器来检查加载何时完成。文档本身指出:
loadBytes() 方法是异步的。在访问已加载对象的属性之前,您必须等待“init”事件。
因为您在调用 loadBytes()
之后尝试直接
访问代码,此时它实际上尚未加载任何内容,所以您将得到一个空位图。虽然您可以在调度“init”事件后访问数据,但最好等待“complete”事件,因为您希望图像完成加载(而不是半途完成)。 我已经将您的代码调整为应该可以工作的内容:
function dosomething(evt:Event):void {
trace("dosomething");
var img_file:FZipFile = zip.getFileByName("test.png");
var loaderzip:Loader = new Loader();
loaderzip.contentLoaderInfo.addEventListener(Event.COMPLETE, getImage);
loaderzip.loadBytes(img_file.content);
}
function getImage(e:Event):void {
var loaderInfo:LoaderInfo = e.currentTarget as LoaderInfo;
var image:Bitmap = Bitmap(loaderInfo.content);
addChild(image);
}
(我自己没有测试过,但这只是为了给你一个总体思路。)
请注意,您应该将事件侦听器添加到
loaderzip.contentLoaderInfo
,而不是只是
loaderzip
。这就是实际调度事件的内容,它还包含加载的内容。