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,加载主程序文件。
- 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出现的系统提示。
- SharedObject本地保存子swf
- SharedObject的用法,SWF保存本地信息。
- 采用SharedObject保存数据到本地
- SharedObject保存数据到本地例子
- SharedObject对象保存二进制数据到本地
- 使用SharedObject保存数据到本地
- 【转】使用AS3 SharedObject & 本地两个swf通过SO进行数据通信
- 关于使用SharedObject来缓存游戏图片或者swf文件资源到客户端本地的研究
- rtmp sharedObject服务器端保存
- AS3 SharedObject的保存路径
- AS3 SharedObject的保存路径
- Flash本地共享对象 SharedObject
- SharedObject
- sharedobject
- SharedObject
- SharedObject
- Flex中的本地共享对象--SharedObject
- Flex中的本地共享对象--SharedObject
- Calculator
- 批量Load/Store指令理解(关于内存地址变化方式)
- Berkeley DB 的LSN重置
- SQL Server事务全攻略
- 读控制论的一些思考
- SharedObject本地保存子swf
- PowerTip of the Day from powershell.com上周汇总(十)
- 快速上手的记录
- MFC中ASSERT()和VERIFY()区别
- 新建远程桌面 地方法
- Oracle的left outer join查询(转)
- Oracle UTL_FILE
- DELPHI中自适应表单的实现----转
- 如何选择Web报表工具