我目前正在编写游戏代码,我将所有外部文件存储在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必须是非null。
任何帮助都会很棒。感谢。
答案 0 :(得分:2)
使用loaderzip.loadBytes()
加载PNG字节时,需要一个事件监听器来检查加载完成的时间。文档本身说明:
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
。这就是实际调度事件的内容,它还包含加载的内容。