0

我正在尝试设置一个预加载器来显示主 swf 的加载进度,其中嵌入了所有资产。我找到了bit-101 上描述的工厂类方法,但似乎没有显示加载进度。swf 加载正常,但 bytesLoaded 始终等于 bytesTotal,因此永远不会调用预加载器。

这是我正在使用的工厂类

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()。但正如我上面提到的,预加载从未显示,因为它似乎正在立即加载所有内容。

这是我嵌入图像的方式问题还是因为我在本地测试?

还有其他人遇到这些问题吗?

谢谢丰富

4

3 回答 3

0

您使用的是什么版本的 Flash?我知道预加载在 CS2 中的工作方式与在 CS3 中的工作方式非常不同。不久前,我在让预加载器在 CS3 中工作时遇到了类似的问题。

http://www.senocular.com/flash/tutorials/faq/

总而言之,AS3 将在执行任何其他操作之前下载 SWF 文件的整个库。要解决此问题,您可以告诉每个库项目不要在第一帧中加载,然后在第一帧中设置您的预加载器。

另一种解决方案是使用单独的 SWF 文件进行预加载。一旦您的预加载器 SWF 加载完毕,它就可以使用 Loader 对象来加载更大的 swf 文件。然后,Loader 对象提供了通过事件获取已加载数据量的方法。

第三种解决方案是将您的 SWF 文件上传到 MochiAds 之类的网站,并允许它们提供预加载功能。如果您正在制作游戏,这将是最简单的解决方案。

于 2009-11-05T17:48:56.937 回答
0

我在所有游戏中都成功地使用了相同的方法,它必须进行远程测试,因为本地测试几乎会在加载器做出反应之前自动加载所有字节。

所以是的,这是因为您在本地进行测试。将 SWF 上传到您的网络服务器,您可以从那里看到实际的加载进度。如果你有一个快速的连接,为了测试的目的人为地膨胀你的文件也不会受到伤害。

于 2009-11-03T15:19:41.057 回答
0

我没有使用 Flash,所以上面提到的第一帧不显示解决方案不是一个选项,因为我没有直接访问库或时间线的权限。工厂方法是在纯动作脚本中实现此目的的一种方法,如果您在 Flash IDE 之外进行开发,则这是必需的。

经过更多研究,我发现问题出在 FlashDevelop 的实现上。实际上,最新的 FlashDevelop 版本中有一个内置模板,可以实现相同的结果,而无需导入大量 Flex 组件。

如果您需要更多信息,请查看这篇文章

http://www.flashdevelop.org/community/viewtopic.php?f=13&t=3365

于 2009-11-06T14:05:20.157 回答