为什么要在 Flash 中使用预加载器
Why should I use preloader in Flash
我不太了解预加载器,但我阅读了几篇文章和 Adobe 说明。所以我对在 Flash 应用程序中使用预加载器感到困惑。
我打算从库中调用所有 MovieClips、声音等,舞台上不会有任何内容。对于这种情况,应用预加载器是否合乎逻辑?如果是,哪种方法最合适(即使 swf 大小更小)?
如果不说明应用程序的上下文,就不可能告诉您哪种方法最好。
对于横幅和较小的 swf(<100k)等,我不应该使用任何类型的预加载器。 Flash 将自行处理加载(只是不显示可视加载器)
对于较大的 swf 游戏,我通常让一个小的 swf 加载主 swf。
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
[SWF(width="992", height="768", frameRate="30", backgroundColor="0x000000")]
public class Preloader extends Sprite
{
private var percent:Number;
private var loader:Loader;
public function Preloader()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var movieurl:String = loaderInfo.parameters.movieurl;
loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
var loaderContext : LoaderContext = new LoaderContext(false,new ApplicationDomain(null));
loader.load( new URLRequest("main.swf" + version),loaderContext);
}
private function progressHandler(event:ProgressEvent):void
{
percent = ((event.bytesLoaded / event.bytesTotal)*100);
trace ("laoded": percent)
}
private function completeHandler(event:Event):void{
//removeChild(progressBar);
addChild(loader);
}
}
}
如果您的应用程序必须存在 1 个 swf。您可以使用预加载器 class
主要 swf class
[Frame(factoryClass="Preloader")]
[SWF(width = "950", height = "600")]
public class Main extends Sprite
{
// do your coding
}
预加载器 swf class
package {
import erasmus.simulation.LoaderFC;
import flash.display.DisplayObject;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.UncaughtErrorEvent;
import flash.utils.getDefinitionByName;
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);
}
private function progress(e:ProgressEvent):void {
var progress : Number = e.bytesLoaded / e.bytesTotal;
trace ("loader progress")
}
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);
var mainClass:Class = getDefinitionByName('Main') as Class; // class must be a string reference
this.stage.addChild(new mainClass(this) as DisplayObject);
}
}
}
舞台上不会有任何内容 - 我假设您使用的是带有时间轴的 Flash IDE?
在这种情况下(实际上还有其他情况),您必须使用预加载器。有可能(即使 运行 在本地)当您尝试从库中访问某些内容时,它还没有完全加载。
在 Flash 中 IDE 预加载器可以是时间轴中的前两帧:一些进度精灵或只是跨越两帧的 TextField
,第一帧什么都不做,第二帧检查 bytesLoaded
与 bytesTotal
相比,如果电影尚未完全加载,则转到第一帧。第三帧是所有主要代码开始的地方。
请注意,您的所有库资源都必须设置为 'export in Frame 3',即不在加载程序处于活动状态的任何帧中。
或者,您可以将单帧与基于事件的加载程序一起使用。
使用FlashDevelop时,有一个预加载器的现成项目模板。
当人们使用他们的某些库 类 或预加载器中的资产来显示漂亮的进度指示器时,这是一个常见的错误。在那种情况下,必须首先加载所有数据,预加载器不能立即工作。它看起来像空白屏幕,暂停时间长且没有预加载器,然后应用程序立即加载了 100%。所以预加载器变得毫无意义,它不能向用户显示任何进度。
我不太了解预加载器,但我阅读了几篇文章和 Adobe 说明。所以我对在 Flash 应用程序中使用预加载器感到困惑。
我打算从库中调用所有 MovieClips、声音等,舞台上不会有任何内容。对于这种情况,应用预加载器是否合乎逻辑?如果是,哪种方法最合适(即使 swf 大小更小)?
如果不说明应用程序的上下文,就不可能告诉您哪种方法最好。
对于横幅和较小的 swf(<100k)等,我不应该使用任何类型的预加载器。 Flash 将自行处理加载(只是不显示可视加载器)
对于较大的 swf 游戏,我通常让一个小的 swf 加载主 swf。
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
[SWF(width="992", height="768", frameRate="30", backgroundColor="0x000000")]
public class Preloader extends Sprite
{
private var percent:Number;
private var loader:Loader;
public function Preloader()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var movieurl:String = loaderInfo.parameters.movieurl;
loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
var loaderContext : LoaderContext = new LoaderContext(false,new ApplicationDomain(null));
loader.load( new URLRequest("main.swf" + version),loaderContext);
}
private function progressHandler(event:ProgressEvent):void
{
percent = ((event.bytesLoaded / event.bytesTotal)*100);
trace ("laoded": percent)
}
private function completeHandler(event:Event):void{
//removeChild(progressBar);
addChild(loader);
}
}
}
如果您的应用程序必须存在 1 个 swf。您可以使用预加载器 class
主要 swf class
[Frame(factoryClass="Preloader")]
[SWF(width = "950", height = "600")]
public class Main extends Sprite
{
// do your coding
}
预加载器 swf class
package {
import erasmus.simulation.LoaderFC;
import flash.display.DisplayObject;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.UncaughtErrorEvent;
import flash.utils.getDefinitionByName;
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);
}
private function progress(e:ProgressEvent):void {
var progress : Number = e.bytesLoaded / e.bytesTotal;
trace ("loader progress")
}
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);
var mainClass:Class = getDefinitionByName('Main') as Class; // class must be a string reference
this.stage.addChild(new mainClass(this) as DisplayObject);
}
}
}
舞台上不会有任何内容 - 我假设您使用的是带有时间轴的 Flash IDE?
在这种情况下(实际上还有其他情况),您必须使用预加载器。有可能(即使 运行 在本地)当您尝试从库中访问某些内容时,它还没有完全加载。
在 Flash 中 IDE 预加载器可以是时间轴中的前两帧:一些进度精灵或只是跨越两帧的 TextField
,第一帧什么都不做,第二帧检查 bytesLoaded
与 bytesTotal
相比,如果电影尚未完全加载,则转到第一帧。第三帧是所有主要代码开始的地方。
请注意,您的所有库资源都必须设置为 'export in Frame 3',即不在加载程序处于活动状态的任何帧中。
或者,您可以将单帧与基于事件的加载程序一起使用。
使用FlashDevelop时,有一个预加载器的现成项目模板。
当人们使用他们的某些库 类 或预加载器中的资产来显示漂亮的进度指示器时,这是一个常见的错误。在那种情况下,必须首先加载所有数据,预加载器不能立即工作。它看起来像空白屏幕,暂停时间长且没有预加载器,然后应用程序立即加载了 100%。所以预加载器变得毫无意义,它不能向用户显示任何进度。