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;
}