actionscript project 中的预加载
现在又很多的sns、web game都是用 flash来做的,其中有的是用Flas CS开发完成的,又的使用Flex porject完成的也有是用 Actionscript project完成的。Flex peoject的Preloader他是给你做好的,你只要做一下相关的设置或继承就可以了。那么怎么用actionscript project中实现preloader呢。
flash早期的设计的目的就是想让flash边下载边播放,所以都把资源都编译到相应的帧当中去了,flex project application中一般有两帧:一帧是PreLoader,一帧是Application。这样我们在第一帧中放置一些简单的加载动画来减缓对第二帧的加载的等待。actionscript project中只有一帧,所以loader要单独做swf来load你的application,但是样对于一个web game或以个sns app的逻辑上和代码管理上并不是很好,所以我们要早到在actionscript project实现编译出两帧的办法来。
那就是
frames.frame label class name [...]
generate-frame-loader=true|false
[Frame(factoryClass="mx.managers.SystemManager")]
flex sdk中对此的相关的相关介绍很少或者就没有,也只能到网上去看看有没有比较权威的人士对他做出的解释。
今天看到一个比较老的文章,就是将这个的http://www.bit-101.com/blog /?p=946 介绍的很全面很细致,但是结果试下来却没有成功。
按照上面的方法,我声明了主application(MyApplication) [Frame(factoryClass="SystemManager",label="hello")]
然后在SystemManager中实现了Preloader和对MyApplication的初始化。
但是在
/**这里不能直接写成:
var app:Application = new Application();
这样的由于引用到 Application,Application中所有的资源都会被编译到第一帧来
这样的话 PreLoader就没有意义了,你也看不到PreLoader,就跳到第二帧了
**/
var appCls:Class = getDefinitionByName("MyApplication") as Class;
var app:DisplayObject = new appCls() as DisplayObject;
addChild(app);
这里还是报错,看了下flash的大小,看来MyApplication是没有编译到flash的第二帧。
于是我在编译参数里面,设置了
-frames.frame MyApplication MyApplication
就可以了,MyApplication是被编译到了第二帧,这样第一帧只有很少的代码量和资源引用,这样flash就可以很快的将一帧加载完并显示 loading状态。
*这里唯一要注意的地方就是,在第一帧中 不要将一些不要的资源引用进来,这样会增大第一帧的体积。
类文件:
package {
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.utils.getDefinitionByName;
public class SystemManager extends MovieClip {
private var preLoader:PreLoader;
public function SystemManager() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stop();
preLoader = new PreLoader();
addChild(preLoader);
preLoader.x = stage.stageWidth/2 - preLoader.width/2;
preLoader.x = stage.stageHeight/2 - preLoader.height/2;
loaderInfo.addEventListener(ProgressEvent.PROGRESS,progressHandle);
loaderInfo.addEventListener(Event.COMPLETE,completeHandler);
}
private function progressHandle(e:ProgressEvent):void {
preLoader.setProgress(e.bytesLoaded,e.bytesTotal);
}
private function completeHandler(e:Event):void {
loaderInfo.removeEventListener(ProgressEvent.PROGRESS,progressHandle);
loaderInfo.removeEventListener(Event.COMPLETE,completeHandler);
this.removeChild(preLoader);
preLoader = null;
nextFrame();
initApplication();
}
private function initApplication():void {
/**这里不能直接写成:
var app:Application = new Application();
这样的由于引用到 Application,Application中所有的资源都会被编译到第一帧来
这样的话 PreLoader就没有意义了,你也看不到PreLoader,就跳到第二帧了
**/
var appCls:Class = getDefinitionByName("MyApplication") as Class;
var app:DisplayObject = new appCls() as DisplayObject;
addChild(app);
}
}
}
package {
import flash.display.Sprite;
import mx.core.BitmapAsset;
[Frame(factoryClass="SystemManager",label="hello")]
public class MyApplication extends Sprite {
[Embed(source="tets.png")]
private var bigPicCls:Class;
public function MyApplication() {
var b:BitmapAsset = new bigPicCls() as BitmapAsset;
addChild(b);
}
}
}
package {
import flash.display.Sprite;
import flash.text.TextField;
public class PreLoader extends Sprite {
public function PreLoader() {
var t:TextField = new TextField();
t.border = true;
t.text = "loading......";
addChild(t);
}
public function setProgress(loaded:uint,total:uint):void {
var t:TextField = getChildAt(0) as TextField;
t.text = "load: "+ loaded/1000 + "/" + total/1000;
trace("load: "+ loaded/1000 + "/" + total/1000);
}
}
}