0

我目前正在编写游戏代码,并将所有外部文件存储在一个 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 必须为非空。

任何帮助都会很棒。谢谢。

4

1 回答 1

2

当您使用 加载 PNG 字节loaderzip.loadBytes()时,您需要一个事件侦听器来检查它何时完成加载。文档本身指出:

loadBytes() 方法是异步的。在访问已加载对象的属性之前,您必须等待“init”事件。

因为您试图在调用 之后直接loadBytes()访问代码,此时它实际上并没有加载任何内容,所以您将获得一个空位图。

尽管您可以在“init”事件发送后访问数据,但最好等待“完成”事件,因为您希望图像完成加载(而不是完成一半)。我已将您的代码调整为应该可以使用的代码:

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. 这就是实际调度事件的内容,它还包含加载的内容。

于 2013-08-07T09:29:09.280 回答