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出现的系统提示。

posted @ 2009-08-05 18:02  zhych  阅读(506)  评论(0编辑  收藏  举报