Actionscript Flash Player如何加载主SWF文件?
更新: 似乎每个人都没有彻底阅读我的问题,所有答案都建议我预加载或使用外部资产。因此,任何愿意回答的人,请注意本帖中的大胆问题。谢谢Actionscript Flash Player如何加载主SWF文件?,actionscript,load,flash,lazy-loading,Actionscript,Load,Flash,Lazy Loading,更新: 似乎每个人都没有彻底阅读我的问题,所有答案都建议我预加载或使用外部资产。因此,任何愿意回答的人,请注意本帖中的大胆问题。谢谢 我正在开发一个简单的Flash应用程序,它只有一个SWF文件。我希望SWF电影尽快开始播放,这样我就不会为它构建预加载程序。如果我的actionscript代码引用了尚未加载的资源,会发生什么情况 例如,当电影刚刚加载到第10帧时,该代码会导致播放头从第1帧跳到第20帧在这种情况下,flash player将? 阻止脚本执行,停止播放,继续从帧11加载到20(
我正在开发一个简单的Flash应用程序,它只有一个SWF文件。我希望SWF电影尽快开始播放,这样我就不会为它构建预加载程序。如果我的actionscript代码引用了尚未加载的资源,会发生什么情况 例如,当电影刚刚加载到第
10帧时,该代码会导致播放头从第1帧跳到第20帧在这种情况下,flash player将?
- 阻止脚本执行,停止播放,继续从帧
11
加载到20
(不执行脚本),跳转到帧20
,并在加载脚本时在该帧调用脚本
- 阻止脚本执行,停止播放,忽略加载帧
11
到19
,加载帧20
,跳转到帧20
并在该帧调用脚本
- 忽略跳转到帧
20
,是否在转到帧20
语句后继续执行下一个语句
- 还是别的什么
如果flash player不忽略跳转到帧20
,则当帧20
完全加载时,会触发任何事件
?
注意:第一个问题的答案应该集中在我的示例上,涵盖所有情况(例如从库中附加电影…)更好,但不是必需的
谢谢 Flash将始终在运行应用程序之前加载所有帧。但是,帧内容可能未完全加载。因此,如果第20帧上有一些图像,它们可能不会出现
但基本上你不应该依赖Flash来为你加载东西——它可能会按照你想要的顺序来做,但可能不会。如果您有许多资源,并且正在从一帧跳到另一帧,您应该使用加载程序类自己处理加载。Flash player将尝试跳到第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 start Main
在您的情况下,您必须为项目定义渐进加载方法
首先,开发外部资产,最初只加载一个并显示它。只需启动第二个加载,并仅使用加载的UI管理显示。因此,您可以避免预加载。当您将获得加载的项目列表时,只需以渐进方式逐个显示即可
首先只显示一个。
第二次加载后,第一次加载和第二次加载。。
那么,你必须管理好
另一方面,您必须在第一个显示器上等待,直到下一个显示器资产加载结束。这次不要显示预加载程序 为了找到我的问题的答案,我用Adobe Flash Professional做了一些测试。感兴趣的每个人都可以通过在Adobe Flash中执行以下步骤来复制测试:
例如,创建一部带有某些帧的电影,每个帧包含一个图像和一些actionscript代码
在Flash Professional中选择菜单控制->测试电影->将显示调试播放器
在调试播放器中,选择菜单“查看->下载设置”,然后选择所需的下载速度
此外,在调试播放器中,确保已选中“视图”菜单下的“带宽探查器”和“模拟下载”
如果脚本未更改播放头,Flash player将:
加载第1帧并等待它完全加载
转到第1帧
在第1帧上执行脚本
显示框1
对第2帧执行上述步骤,依此类推。。。(停留在第1帧直到第2帧完全加载,然后转到第2帧,执行脚本,显示…)
如果脚本更改播放头,例如从第1帧跳到第20帧,Flash player将:
继续执行第1帧中的所有脚本语句(即使这些语句跟随跳转语句)并显示第1帧
如果加载了第20帧,则跳转到第20帧,在其上执行脚本并显示它。如果未加载,请跳转到最近加载的帧(在我的问题示例中是第10帧),但不要在该帧上执行脚本
在AS2中,尝试以下代码。第一帧显示加载进度,第三帧显示主要内容。
此代码位于ActionScript 2.0参考(getBytesLoaded)中
出于某种原因,我不想在播放之前完全加载电影,也不想在需要时加载外部资源。@ExpExc,这有点矛盾。您不希望加载所有内容,也不希望根据需要加载内容。那么,您希望如何处理加载资产呢?我希望在需要时加载已经嵌入到主swf中的东西,而不希望从外部加载。你知道吗?我不记得在医生那里见过这方面的事。我的猜测是,当您到达帧时,是否要加载资源是未定义的。这可能取决于SWF的编译方式、资产的添加顺序、互联网连接速度等。要想让东西按您的意愿加载,唯一的方法就是
if (this._framesloaded<this._totalframes) {
this.gotoAndPlay(1);
} else {
this.gotoAndStop(3);
}
this.loaderInfo.addEventListener(Event.COMPLETE, completeHandler);