我知道有很多关于预加载器的先前主题,我试图跟随它们中的每一个但我仍然遇到同样的问题(他们帮助我从80%开始 - > 50%)
现在它从61450 / 125207
开始,约为50%。
这是我的Main Document
(整个项目的默认类文件)类:
public class MainDocument extends MovieClip
{
private var preloader:Preloader;
private var sB:startButton;
public function MainDocument()
{
preloader = new Preloader();
preloader.x = 300;
preloader.y = 400;
addChild(preloader);
loaderInfo.addEventListener(Event.COMPLETE,addStartButton,false,0,true);
}
private function addStartButton(e:Event):void
{
sB = new startButton();
sB.x = 300;
sB.y = 450;
sB.addEventListener(MouseEvent.CLICK,sMainMenu,false,0,true);
addChild(sB);
loaderInfo.removeEventListener(Event.COMPLETE,addStartButton);
}
private function sMainMenu(e:Event):void
{
sB.removeEventListener(MouseEvent.CLICK,sMainMenu);
removeChild(sB);
removeChild(preloader);
sB = null;
preloader = null;
var menuScreen = new MenuScreen();
addChild(menuScreen);
//I have heard that the following code might work better:
//var menuScreen:Class = getDefinitionByName("MenuScreen") as Class;
//addChild(new menuScreen() as DisplayObject);
}
}
它附加的Preloader
:
public class Preloader extends MovieClip
{
public function Preloader()
{
addEventListener(Event.ENTER_FRAME,Load);
}
private function Load(e:Event):void
{
//"bar" is a movieclip inside the preloader object
bar.scaleX = loaderInfo.bytesLoaded/loaderInfo.bytesTotal;
//"percent" is a dynamic text inside the preloader object
percent.text = Math.floor(loaderInfo.bytesLoaded/loaderInfo.bytesTotal*100)+"%";
trace(loaderInfo.bytesLoaded+" / "+loaderInfo.bytesTotal);
if (loaderInfo.bytesLoaded == loaderInfo.bytesTotal)
{
removeEventListener(Event.ENTER_FRAME,Load);
}
}
}
- >除了Export on Frame 1
Preloader
- >第一帧上没有对象;第一帧上唯一的代码是stop();
- >我在第二帧中放置了每个MovieClip的副本,当点击startButton时,运行gotoAndStop(3);
,所以没有人看到第2帧。
如果有人知道我可以忘记的任何简单,请告诉我!
谢谢!
答案 0 :(得分:1)
您想在预装的文件中使用预加载器。在这种情况下,项目的其余部分代码和资产将会膨胀。您看到预加载器似乎被延迟的原因是因为swf必须在任何代码执行之前完全加载。这包括舞台上的所有资源,无论它们在哪个框架上,即使您有适当的设置导出除第1帧之外的其他内容。相反,请尝试使用空白shell作为预加载器。这个shell中没有任何内容,只有加载器代码和预加载器图形或动画。加载完成后,隐藏预加载器并将加载的内容添加到shell的舞台或shell中的容器动画片段。
以下所有代码都在你的shell中,这只是另一个FLA文件,其中没有任何内容,但此代码和预加载器栏。此文件的尺寸应与您加载到其中的文件相同,即您尝试预加载的原始swf文件。
通过调用 loadSwf(" mySwfNameOrURLToSwf.swf")来使用它; 变量 _percent 将填充当前的加载百分比,您可以将其与加载条比例对应。假设预加载条名为" bar",onSwfLoaded函数中的 bar.visible = false; 行将隐藏它。 addChild(_swf)将加载的swf添加到shell的阶段。 _swf.init(); 行引用了一个函数,你需要添加一个名为 init()的加载swf,它启动你加载的swf做它应该做的任何事情做。让加载的swf中的所有内容现在都在第一帧开始,包括 init()函数。
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Bitmap;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.SecurityDomain;
import flash.system.LoaderContext;
import flash.system.Security;
import flash.events.Event;
import flash.events.ProgressEvent;
var _swfLoader:Loader;
var _swf:DisplayObject;
var _percent:Number;
function loadSwf( swfURL:String ):void
{
_swfLoader = new Loader();
var req:URLRequest = new URLRequest( swfURL );
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
loaderContext.checkPolicyFile = true;
_swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onSwfProgress);
_swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoaded);
_swfLoader.load(req, loaderContext);
}
function onSwfProgress( evt:Event ):void
{
_percent = Math.round( ( evt.target.bytesLoaded / evt.target.bytesTotal ) * 100 );
}
function onSwfLoaded( evt:Event ):void
{
_swfLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onSwfProgress);
_swfLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onSwfLoaded);
_swf = _swfLoader.content;
addChild( _swf );
bar.visible = false;
_swf.init();
_swfLoader = null;
}
答案 1 :(得分:0)
你的代码看起来不错。 如果您不在http服务器上,则会模拟加载过程。
编译完成后,按crtl + B. 在菜单中,您可以选择下载速度并再次按ctrl + enter来模拟下载。
它可能会帮助您调试预加载器
答案 2 :(得分:0)
@Lee Burrows
你所说的是对的,如果你看一下我在代码末尾提到的内容(三个大胆点)会更好
我使用的解决方案是:
- >我在3帧文档上将所有内容设置为Export on Frame 2
。
- >删除第2帧上的所有内容
- >创建了一个TextField
via构造函数,并使用drawRectangle
加载栏
- >第1帧没有动画片段,并且已使用
var menuScreen:Class = getDefinitionByName("MenuScreen") as Class;
addChild(new menuScreen() as DisplayObject);
而不是之前的代码。
我原来无法正常工作的原因是,正如Lee Burrows
提到的那样Export for Actionscript
会挂起X = 1
Export on Frame X
中的加载,无论Export on Frame 1
是否Export for Actionscript
1}}是否被检查过。将它更改为2或取消选中{{1}}是两个解决方案(除非它没有为actionscript导出,否则它的代码不能被引用)。
Preloader现在开始时约为2%。