SharedObject本地保存子swf
我们做的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出现的系统提示。