更新
似乎每个人都没有彻底阅读我的问题,所有答案都建议我预加载或使用外部资产。所以任何愿意回答的人都请注意这篇文章中的大胆的问题。谢谢!
我正在开发一个只有一个SWF文件的简单Flash应用程序。我希望SWF电影尽快开始播放,所以我不为它构建一个预加载器。如果我的动作代码引用了尚未加载的资源,会发生什么?
例如,当电影刚加载到第1
帧时,代码会使播放头从第20
帧跳到第10
帧。 在这种情况下,Flash播放器会吗?
11
帧加载到20
(不执行脚本),跳转到第20
帧并在第39帧时调用该帧的脚本; s装?11
加载到19
,加载框架20
,跳转到框架20
并在该框架调用脚本?< / LI>
20
帧,在转到第20
帧语句后继续执行下一个语句? 如果Flash播放器没有忽略跳转到第20
帧,那么在完全加载第event
帧时会触发任何20
吗?
注意:第一个问题的答案应该集中在我的示例上,涵盖所有情况(例如从库中附加电影......)更好,但不是必需的。
谢谢!
答案 0 :(得分:3)
Flash将始终在运行应用程序之前加载所有帧。但是,帧内容可能未完全加载。因此,如果您在第20帧上有一些图像,它们可能不会出现。
但基本上你不应该依赖Flash为你加载东西 - 它可能按照你想要的顺序进行,但也许不会。如果你有很多资产并且你是逐帧跳跃的,你应该使用Loader
类自己处理加载。
答案 1 :(得分:1)
Flash播放器会尝试跳转到第20帧。但它只会到加载的帧。因此,如果你告诉它去20,只加载10,你将进入10。
在未加载的代码中调用资源将抛出错误,或将该对象定义为null。不用说,这需要避免。首先加载这些资源。
一个好的解决方案是使用-frame编译器参数来创建一个2帧的flash影片。第一个包含您的预加载器,第二个帧包含完整的应用程序。这样,您可以在调用完整功能之前预先加载所需内容。
这是一个如何做到这一点的例子。
package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.utils.getDefinitionByName;
/**
* ...
* @author Zachary Foley
*/
public class Preloader extends MovieClip
{
public function Preloader()
{
if (stage) {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
}
addEventListener(Event.ENTER_FRAME, checkFrame);
loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);
// TODO show loader
}
private function ioError(e:IOErrorEvent):void
{
trace(e.text);
}
private function progress(e:ProgressEvent):void
{
// TODO update loader
}
private function checkFrame(e:Event):void
{
if (currentFrame == totalFrames)
{
stop();
loadingFinished();
}
}
private function loadingFinished():void
{
removeEventListener(Event.ENTER_FRAME, checkFrame);
loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
// TODO hide loader
startup();
}
private function startup():void
{
var mainClass:Class = getDefinitionByName("Main") as Class;
addChild(new mainClass() as DisplayObject);
}
}
}
要使用此功能,您需要将frame参数添加到构建中。对于此示例,frame参数将为:
-frame start Main
答案 2 :(得分:0)
在您的情况下,您必须为项目定义渐进式加载方法。
首先开发外部资产,最初只加载一个并显示它。只需启动第二个加载并仅使用加载的UI管理显示。所以你可以避免预加载器。当你将获得加载项目列表时,只需逐步显示逐个显示。
首先只显示一个。 第二次加载后第一次&amp;第二个.. 那么你必须管理
另外,你必须等到第一次显示到下一个显示资产加载将结束。并且这次不显示预装载器。
答案 3 :(得分:0)
我已经使用Adobe Flash Professional进行了一些测试,以便找到我的问题的答案。每个感兴趣的人都可以通过在Adobe Flash中执行以下步骤来重现测试:
如果脚本没有更改播放头,Flash播放器将:
如果脚本改变播放头,例如从第1帧跳到第20帧,Flash播放器将:
答案 4 :(得分:0)
,试试这段代码。加载进度显示在第一帧,主要内容显示在第3帧。 此代码在ActionScript 2.0参考(getBytesLoaded)中。 http://help.adobe.com/ko_KR/AS2LCR/Flash_10.0/00001304.html#1333866
if (this._framesloaded<this._totalframes) {
this.gotoAndPlay(1);
} else {
this.gotoAndStop(3);
}
在AS3中,使用此。
this.loaderInfo.addEventListener(Event.COMPLETE, completeHandler);