SharedObject本地保存子swf

来源:互联网 发布:201淘宝开店成功经验 编辑:程序博客网 时间:2024/05/20 11:22

我们做的flash相对于网页一般都比较大,一般都会上100K,有的则有数M之多,如果每次都让用户下载完毕再观看的话则大大的降低用户体验,在游戏中尤为突出,没有人会愿意等待,而且现在网页游戏越来越流行,如果能在用户第一次加载的时候就保存在本地,那对用户体验有很大的提高。
昨天经过一天的实践,终于实现了这个想法,呵呵!
先说一下文件结构,这个方案一般由三个文件组成:
一个用于加载的SWF,loader.swf,这个主要就是负责加载主文件,本地保存功能,可以在上面说明加载进度,一般也就十几二十K,如果够简单还可以只有几K。
一个配置文件,config.xml,主要就是记录主文件的版本,当然你也可以加一些信息在里面,loader.swf先下载这个文件,分析主文件是否已有更新,如果有更新则下载新的下来,如果没有而且本地已保存的话就从本地加载。
最后是主文件,也就是真正要显示的文件。
下面来说一下loader.swf的实现。
我们知道,flash在本地保存且访问的话只能通过SharedObject来实现,而SharedObject只能保存Number,String,Object等数据结构,而DisplayObject是不能够保存的,所以只能想办法把加载的主文件Serialize才能保存,昨天听一兄弟提醒,ByteArray就是一个好的方式。接下来是步骤(加配置文件及解析的步骤略过):

1,
加载主程序文件。

  1.                 private var _byteArray:ByteArray = new ByteArray();
  2.                 private function loadFile():void
  3.                 {
  4.                         var request:URLRequest = new URLRequest();
  5.                         request.url = "test.swf";
  6.                         var urlStream:URLStream = new URLStream();
  7.                         urlStream.addEventListener(Event.COMPLETE, streamCompleteHandler);
  8.                         urlStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
  9.                         urlStream.load(request);
  10.                 }
  11.                
  12.                 private function progressHandler(e:ProgressEvent):void
  13.                 {
  14.                         var urlStream:URLStream = e.currentTarget as URLStream;
  15.                         while (urlStream.bytesAvailable)
  16.                         {
  17.                                 urlStream.readBytes(_byteArray, _byteArray.length);
  18.                         }
  19.                 }
  20.                
  21.                 private function streamCompleteHandler(e:Event):void
  22.                 {
  23.                         trace("URLStream加载完成");
  24.                         //保存
  25.                 }
复制代码

2,保存到SharedObject,如果你的主程序太大,超过SharedObject的默认大小(100k)的话应该提示用户,当然出于对用户的尊重,保存前都应该有提示,并询问用户是否要保存以及保存的好处。

  1.                 private function saveFile():void
  2.                 {
  3.                         var so:SharedObject = null;
  4.                         try{
  5.                                 so = SharedObject.getLocal("yourdomain", "/");
  6.                         }
  7.                         catch (e:Error)
  8.                         {
  9.                                 trace("无法使用保存功能");
  10.                                 //在这里编写你的提示信息
  11.                                 return;
  12.                         }
  13.                         so.data.main = _byteArray;
  14.                         so.data.version = "1.0";//在配置文件中取得
  15.                         try {
  16.                                 var flushResult:String = so.flush();       
  17.                                 if (flushResult == SharedObjectFlushStatus.PENDING)
  18.                                 {
  19.                                         trace("保存的磁盘空间不够");
  20.                                         so.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);
  21.                                 }
  22.                                 else if (flushResult == SharedObjectFlushStatus.FLUSHED)
  23.                                 {
  24.                                         trace("保存成功");
  25.                                 }
  26.                         }
  27.                         catch (e:Error)
  28.                         {
  29.                                 trace("保存失败"+e.toString());
  30.                         }                       
  31.                 }
  32.                
  33.                 private function statusHandler(e:NetStatusEvent):void
  34.                 {
  35.                         if (e.info.code == "SharedObject.Flush.Failed")
  36.                         {
  37.                                 trace("你拒绝了在本地保存");
  38.                         }
  39.                         else if(e.info.code == "SharedObject.Flush.Success")
  40.                         {
  41.                                 trace("保存成功");
  42.                         }
  43.                         so.removeEventListener(NetStatusEvent.NET_STATUS, statusHandler);
  44.                 }
复制代码

3,最后是读取的部分

  1.                 public function readFile():void
  2.                 {
  3.                         var so:SharedObject = null;
  4.                         try{
  5.                                 so = SharedObject.getLocal("yourdomain", "/");
  6.                         }
  7.                         catch (e:Error)
  8.                         {
  9.                                 trace("无法使用保存功能");
  10.                                 return;
  11.                         }
  12.                         if (so.data.main == undefined||so.data.main ==null)
  13.                         {
  14.                                 trace("没有可显示的内容");
  15.                                 return;
  16.                         }
  17.                         var byteArray:ByteArray = so.data.main;
  18.                         var loader:Loader = new Loader();
  19.                         loader.loadBytes(byteArray, new LoaderContext(false));
  20.                         addChild(loader);
  21.                 }
复制代码

希望这个对你有帮助!

下面是用户允许的存储空间不够时flash player出现的系统提示。
aa.jpg

原创粉丝点击