我对预加载器的了解不多,但我已阅读了几篇文章和Adobe说明。所以我对在Flash应用程序中使用的预加载器感到困惑。
我打算从图书馆调出所有的MovieClip,声音等等,而且没有任何东西会在舞台上。对于这种情况,应用预加载器是否合乎逻辑,如果是这样,哪种方法最合适(即使swf尺寸较小)?
答案 0 :(得分:3)
当你没有告诉你申请的背景时,不可能告诉你哪种方法是最好的。
对于横幅和较小的swf(<100k)等,我不应该使用任何类型的预加载器。 Flash将处理加载本身(仅显示可视加载器)
对于更大的瑞士法郎游戏,我通常会让一个小型瑞士法郎加载主要的瑞士法郎。
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个瑞士法郎。您可以使用Preloader类
主要的swf类
[Frame(factoryClass="Preloader")]
[SWF(width = "950", height = "600")]
public class Main extends Sprite
{
// do your coding
}
preloader 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);
}
}
}
答案 1 :(得分:2)
在舞台上什么都没有 - 我假设您正在使用带有时间轴的Flash IDE?
在这种情况下(实际上还有其他情况),您必须使用预加载器。有可能(即使在本地运行时)当您尝试从库中访问某些内容时,它仍然无法完全加载。
在Flash IDE中,预加载器可以是时间轴中的前两个帧:一些进度精灵或仅跨越两个帧的TextField
,第一帧不执行任何操作,第二帧检查bytesLoaded
与{{{ 1}}如果电影尚未完全加载,则转到第一帧。第三帧是所有主要代码开始的地方。
请注意,所有库资源必须设置为“在第3帧中导出”,即不在任何加载器处于活动状态的帧中。
或者,您可以将单帧与基于事件的加载器一起使用。
使用FlashDevelop时,有一个带有预加载器的项目的现成模板。
当人们在预加载器中使用某些库类或资产来显示一个很好的进度指示器时,会出现一个常见的错误。在这种情况下,必须首先加载所有数据,并且预加载器不能立即工作。它看起来像空屏幕,暂停时间长,没有预加载器,然后应用程序一次100%加载。因此预加载器变得毫无意义,它无法向用户显示任何进度。