ShareObject 数据存储
ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份演了这两种角色。而且ShareObject也是按此进行了两种分类,一类是LSO——Local Share Object(本地共享对象)其实类似于cookie,而另一种RSO——Remote Share Object(远程共享对象) 我感觉比较类似于JSP中的Application对象,但好象比Application更强大 一:LSO(本地共享对象) LSO的用法比较简单,和我们平常操作Cookie大同小异: 1.得到一个共享对象: var so:SharedObject=SharedObject.getLocal("mydata","/"); 2.往共享对象里存入值: var user:Object=new Object(); user.userName=userName.text; user.passWord=passWord.text; user.isSaveLogin=(remember.selected==true?1:0); so.data.user=user; 3.清除共享对象里的值: var so:SharedObject=SharedObject.getLocal("mydata","/"); if(so.data.user!=null){ so.data.user=null; } 4.读取共享对象里的值: var so:SharedObject=SharedObject.getLocal("mydata","/"); if(so.data.user!=null){ userName.text=so.data.user.userName; passWord.text=so.data.user.passWord; if(so.data.user.isSaveLogin.toString()=="1"){ remember.selected=true; } 二:RSO(远程共享对象): RSO是服务器端的共享对象,服务器端的数据共享可以实现多个客户端数据共享,在这里服务器我采用Flash Media Server3,FMS的使用非常简便,你只要在安装目录下找到Applications目录,并在其下新建一个子目录就可以成为你的工程或项目了。关于FMS的使用大家可以参考相关文章,本文不做介绍:利用FMS和RSO我们可以实现非常多的功能,诸如,聊天室,联机游戏,视频会议,在线视频录制和视频聊天。。。。。。 public function init ():void { rtmpGo = "rtmp://localhost/basicSO";//这里设置FMS服务器的连接地址,basicSO即为, //FMS安装目录下Applications下自己手动新建的一个文件夹名称,也是FMS的工程名,就是这么简洁,不可意议 nc = new NetConnection( );//产生一个连接对象 nc.connect (rtmpGo);//连接到上面的地址 nc.addEventListener (NetStatusEvent.NET_STATUS,doSO);//加入连接的监听事件,以便根据连接返回的状态做相应处理 } private function doSO (e:NetStatusEvent):void { good=e.info.code == "NetConnection.Connect.Success";//判断是否为连接成功状态 //连接返回的状态有好几种,大家可以参看FMS的文档,很详尽 if (good)//如果连接成轼,执行如下操作 { text_so=SharedObject.getRemote("test",nc.uri,false);//得到远程共享对象,false属性是设置共享的数据为非持久化的, //即重启服务器后,先前的数据不会保存 text_so.connect (nc); text_so.addEventListener (SyncEvent.SYNC,checkSO); //为共享对象添加异步事件,这也是服务器同步处理多客户端最关键的地方, //一个客户端进行了什么操作,其它客户端也会有相应的变化,就是通过此事件来完成的 } } private function sendMsg (e:MouseEvent):void { text_so.setProperty ("msg",textInput.text);//将新的信息存入共享对象 textArea.htmlText+=text_so.data.msg + "\n";//更新客户端的信息列表 } private function checkSO (e:SyncEvent):void { for (var chng:uint; chng { switch (e.changeList[chng].code) { case "clear" : break; case "success" : trace (text_so.data.msg); break; case "change" ://一个客户端改变数据会更新所有客户端 textArea.htmlText+=text_so.data.msg + "\n"; break; } } } 1.首先,先在场景中建立一个动态文字框,并命名为msg_txt,以及三个按钮,别分为open_bt、close_bt、clear_bt等。 2.在影格1输入下方的语法。 var mwtSObj:SharedObject; function obj() { mwtSObj = SharedObject.getLocal("mSObj"); var msg=mwtSObj.data.NOWmode; if (msg !=null) { msg_txt.text=msg; } else { msg_txt.text=""; } } obj(); open_bt.addEventListener(MouseEvent.CLICK,openObj); close_bt.addEventListener(MouseEvent.CLICK,closeObj); clear_bt.addEventListener(MouseEvent.CLICK,clearObj); function openObj(e:MouseEvent) { mwtSObj.data.NOWmode="开"; obj(); } function closeObj(e:MouseEvent) { mwtSObj.data.NOWmode="关"; obj(); } function clearObj(e:MouseEvent) { mwtSObj.data.NOWmode=""; obj(); } package { import flash.display.Sprite; import flash.events.NetStatusEvent; import flash.net.SharedObject; import flash.net.SharedObjectFlushStatus; public class ShareTest extends Sprite { public var socre:int = 100; // 这个是你的得分 private var mySo:SharedObject; public function ShareTest() { readValue(); } public function readValue():void { mySo = SharedObject.getLocal("application-name"); trace("SharedObject 读取...\n"); trace("读取结果为 : " + mySo.data.savedValue + "\n\n"); if(socre > mySo.data.savedValue || mySo.data.savedValue == undefined) { saveValue(socre); } } public function saveValue(_value:int):void { trace("存储中...\n"); mySo.data.savedValue = _value; var flushStatus:String = null; try { flushStatus = mySo.flush(10000); } catch (error:Error) { trace("存储失败"); } if (flushStatus != null) { switch (flushStatus) { case SharedObjectFlushStatus.PENDING: trace("存储量超标了...\n"); mySo.addEventListener(NetStatusEvent.NET_STATUS, onFlushStatus); break; case SharedObjectFlushStatus.FLUSHED: trace("分数成功刷新到磁盘\n"); break; } } trace("\n"); } //清空存储 public function clearValue():void { delete mySo.data.savedValue; } public function onFlushStatus(event:NetStatusEvent):void { switch (event.info.code) { case "SharedObject.Flush.Success": trace("用户授予权限——值保存.\n"); break; case "SharedObject.Flush.Failed": trace("用户拒绝——价值未保存.\n"); break; } trace("\n"); mySo.removeEventListener(NetStatusEvent.NET_STATUS, onFlushStatus); } } } public static var mySo:SharedObject; /** * 把数据保存到本地 * @param dataName 要保存的对象名称 * @param data 要保存的数据 * @param name 参数共享对象名,返回共享对象的参照 * @return * */ public static function saveData(dataName:String,data:Object,name:String="localhostObj"):void { mySo = SharedObject.getLocal(name,"/"); mySo.data[dataName] = data; //强制保存数据,flush可带时间参数,默认为0 mySo.flush(); } /** * 读取本地数据,如果没有该数据,返回null值 * @param dataName 数据的名称 * @param name 参数共享对象名,返回共享对象的参照 * @return * */ public static function getData(dataName:String,name:String="localhostObj"):Object { mySo = SharedObject.getLocal(name,"/"); if(mySo.data[dataName] != null) { return mySo.data[dataName]; } return null; } var mySO:SharedObject = SharedObject.getLocal("republicofcode"); logo_mc.x = mySO.data.my_x; logo_mc.y = mySO.data.my_y; if (!mySO.data.my_y) { logo_mc.x = 150; logo_mc.y = 100; } logo_mc.addEventListener (MouseEvent.MOUSE_DOWN, onDown); function onDown (e:MouseEvent):void { var my_mc = e.target; my_mc.startDrag (); } logo_mc.addEventListener (MouseEvent.MOUSE_UP, onUP); function onUP (e:MouseEvent):void { logo_mc.stopDrag (); mySO.data.my_x = logo_mc.x; mySO.data.my_y = logo_mc.y; mySO.flush (); } logo_mc.buttonMode=true; 就是flash的配色游戏,点一个元件这个元件是个颜色,然后再点衣服,衣服就染成那个颜色(已实现),现在想点保存按钮,把配色保存下来,然后再打开swf后点读取可以把上一次配色显示出来。 部分代码: var game:MovieClip=null; var w:int=0; var mc:MovieClip; var color:uint; var so:SharedObject; if(!so) { so=SharedObject.getLocal("game","/")//这里的game你可以取其他合法的名字 } function InitLevel(m:MovieClip):void { for(var i:int = 1;i<=20;i++) { mc = m.getChildByName("a"+i); if(mc!=null) { mc.addEventListener(MouseEvent.CLICK,onPaint); } } } //a1,a2,...是那些衣服裤子的元件。 function onPeekColor(e:MouseEvent):void { switch (e.currentTarget) { case btnColor1 : color = 0xffffff; break; case btnColor2 : color = 0x37AA00; break; case btnColor3 : color = 0xFFD326; break; case btnColor4 : color = 0x3366FF; break; case btnColor5 : color = 0xFF9900; break; case btnColor6 : color = 0xA852DC; break; case btnColor7 : color = 0xCC0000; break; case btnColor8 : color = 0xFF6ACF; break; case btnColor9 : color = 0x8A5F0D; break; case btnColor10 : color = 0x000000; break; } var ct:ColorTransform = new ColorTransform(); ct.color=color; so.data.mycolor=ct.color; xiguan.yanliao.transform.colorTransform=ct; } function onPaint(e:MouseEvent):void { var mc:MovieClip = e.currentTarget; mc.transform.colorTransform=xiguan.yanliao.transform.colorTransform; }