我们做的flash
相对于网页一般都比较大,一般都会上100K,有的则有数M之多,如果每次都让用户下载完毕再观看的话则大大的降低用户体验,在游戏
中尤为突出,没有人会愿意等待,而且现在网页游戏越来越流行,如果能在用户第一次加载
的时候就保存在本地,那对用户体验有很大的提高。
昨天经过一天的实践,终于实现了这个想法,呵呵!
先说一下文件
结构,这个方案一般由三个文件组成:
一个用于加载的SWF,loader.swf
,这个主要就是负责加载主文件,本地保存功能,可以在上面说明加载进度,一般也就十几二十K,如果够简单还可以只有几K。
一个配置文件,config.xml,主要就是记录主文件的版本,当然你也可以加一些信息在里面,loader.swf先下载这个文件,分析主文件是否已有更新,如果有更新则下载新的下来,如果没有而且本地已保存的话就从本地加载。
最后是主文件,也就是真正要显示的文件。
下面来说一下loader.swf的实现。
我们知道,flash在本地保存且访问的话只能通过SharedObject来实现,而SharedObject只能保存Number,String,Object等数据
结构,而DisplayObject是不能够保存的,所以只能想办法把加载的主文件Seria
lize才能保存,昨天听一兄弟提醒,ByteArray就是一个好的方式。接下来是步骤(加配置文件及解析的步骤略过):
1,
加载主程序
文件。
- private var _byteArray:ByteArray = new ByteArray();
- private function loadFile():void
- {
- var request:URLRequest = new URLRequest();
- request.url = "test.swf";
- var urlStream:URLStream = new URLStream();
- urlStream.addEventListener(Event.COMPLETE, streamCompleteHandler);
- urlStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
- urlStream.load(request);
- }
-
- private function progressHandler(e:ProgressEvent):void
- {
- var urlStream:URLStream = e.currentTarget as URLStream;
- while (urlStream.bytesAvailable)
- {
- urlStream.readBytes(_byteArray, _byteArray.length);
- }
- }
-
- private function streamCompleteHandler(e:Event):void
- {
- trace("URLStream加载完成");
- //保存
- }
2,保存到SharedObject ,如果你的主程序太大,超过SharedObject的默认大小(100k)的话应该提示用户,当然出于对用户的尊重,保存前都应该有提示,并询问用户是否要保存以及保存的好处。
- private function saveFile():void
- {
- var so:SharedObject = null;
- try{
- so = SharedObject.getLocal("yourdomain", "/");
- }
- catch (e:Error)
- {
- trace("无法使用保存功能");
- //在这里编写你的提示信息
- return;
- }
- so.data.main = _byteArray;
- so.data.version = "1.0";//在配置文件中取得
- try {
- var flushResult:String = so.flush();
- if (flushResult == SharedObjectFlushStatus.PENDING)
- {
- trace("保存的磁盘空间不够");
- so.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);
- }
- else if (flushResult == SharedObjectFlushStatus.FLUSHED)
- {
- trace("保存成功");
- }
- }
- catch (e:Error)
- {
- trace("保存失败"+e.toString());
- }
- }
-
- private function statusHandler(e:NetStatusEvent):void
- {
- if (e.info.code == "SharedObject.Flush.Failed")
- {
- trace("你拒绝了在本地保存");
- }
- else if(e.info.code == "SharedObject.Flush.Success")
- {
- trace("保存成功");
- }
- so.removeEventListener(NetStatusEvent.NET_STATUS, statusHandler);
- }
3,最后是读取的部分
- public function readFile():void
- {
- var so:SharedObject = null;
- try{
- so = SharedObject.getLocal("yourdomain", "/");
- }
- catch (e:Error)
- {
- trace("无法使用保存功能");
- return;
- }
- if (so.data.main == undefined||so.data.main ==null)
- {
- trace("没有可显示的内容");
- return;
- }
- var byteArray:ByteArray = so.data.main;
- var loader:Loader
= new Loader();
- loader.loadBytes(byteArray, new LoaderContext(false));
- addChild(loader);
- }
希望这个对你有帮助!
下面是用户允许的存储空间不够时flash player出现的系统提示。