我正在尝试设置一个预加载器来显示主SWF的加载进度,其中嵌入了所有资产。我发现工厂类方法为described on bit-101,但似乎没有显示任何加载进度。 swf加载正常,但bytesLoaded总是等于bytesTotal,因此永远不会调用preloader。
这是我正在使用的工厂类
package src
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.events.Event;
import flash.utils.getDefinitionByName;
/**
* ...
* @author DefaultUser (Tools -> Custom Arguments...)
*/
public class Factory extends MovieClip
{
private var preloader:Preloader;
public function Factory()
{
stop();
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
addEventListener(Event.ENTER_FRAME, enterFrame);
}
public function enterFrame(e:Event):void
{
trace(root.loaderInfo.bytesLoaded, root.loaderInfo.bytesTotal);
if (framesLoaded == totalFrames) {
removeEventListener(Event.ENTER_FRAME, enterFrame);
nextFrame();
init();
}
else {
var percent:Number = root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal;
trace(percent);
}
}
private function init():void
{
var mainClass:Class = Class(getDefinitionByName("Main"));
if (mainClass) {
var mainApp:Object = new mainClass();
addChild(mainApp as DisplayObject);
mainApp.init();
}
}
}
}
在enterFrame事件上调用的跟踪显示bytesLoaded和bytesTotal是相等的。
这是swf加载时调用的Main类。
package
{
import flash.display.Sprite;
[Frame(factoryClass="src.Factory")]
public class Main extends Sprite
{
[Embed(source="images/FinalImg01.jpg")]
private var Image1:Class;
[Embed(source="images/FinalImg02.jpg")]
private var Image2:Class;
[Embed(source="images/FinalImg03.jpg")]
private var Image3:Class;
public function init():void
{
trace("loaded");
}
}
}
这首先正确调用Factory类,然后实例化Main并调用init()。但正如我上面提到的那样,预加载从未显示过,因为它似乎正在直接加载所有内容。
这是我嵌入图片的方式有问题,还是因为我在本地测试?
还有其他人遇到过这些问题吗?
由于 富
答案 0 :(得分:0)
我已经在我的所有游戏中成功使用了相同的方法,它必须进行远程测试,因为本地测试几乎会在加载程序反应之前自动加载所有字节。
是的,这是因为你在本地进行测试。将SWF上传到您的网络服务器,您可以从那里查看实际的加载进度。如果你有快速连接,人为膨胀文件以进行测试也不会有害。
答案 1 :(得分:0)
您使用的是哪个版本的Flash?我知道预加载在CS2中的工作方式与CS3相同。我有一个类似的问题让一个预加载器在CS3中工作了一段时间。
http://www.senocular.com/flash/tutorials/faq/
要与AS3汇总,将在执行任何其他操作之前下载整个SWF文件库。要解决此问题,您可以告诉每个库项目不要在第1帧中加载,然后在第一帧中设置预加载器。
另一种解决方案是使用单独的SWF文件进行预加载。只要您的预加载器SWF加载,它就可以使用Loader对象加载更大的swf文件。然后,Loader对象提供了获取通过事件加载了多少数据的方法。
第三种解决方案是将您的SWF文件上传到像MochiAds这样的网站,并允许它们提供预加载功能。如果您正在制作游戏,这将是最简单的解决方案。
答案 2 :(得分:0)
我没有使用Flash,所以上面提到的第一帧解决方案上没有表示不是一个选项,因为我没有直接访问库或时间轴。如果您在Flash IDE之外进行开发,那么工厂方法是在纯动作脚本中实现此目的的方法。
经过一些研究,我发现问题来自FlashDevelop的实现。实际上,最新的FlashDevelop版本中有一个内置模板可以实现相同的结果,而不会不必要地导入大量的Flex组件。
如果您需要更多信息,请查看此帖子
http://www.flashdevelop.org/community/viewtopic.php?f=13&t=3365