猫岛建设者-用SharedObject存储对象

上个星期特别长,在学校里呆了整整7天。星期三在电脑教室玩《猫岛建设者》玩到一半,无奈swf文件没法保存进度。惋惜啊,当时经验值都一千八百多了呢。要怪只能怪自己,没有弄出个保存的功能来。一回家,就在琢磨怎么写。看书上说SharedObject是个好东西,可以当作cookie来用。欣欣好开心啊,虽然cookie不能吃…… 

忙活了一早上加一下午,终于可以保存游戏进度了。运行swf的时候,会询问是否允许保存数据,然后会创建一个sol后缀的文件,里面装的可是纯天然原生态的AS数据喔。它有个默认的存放路径C:\Documents and Settings\TCXX(用户名)\Application Data\Macromedia\Flash Player\#SharedObjects。 

为了方便重复使用,欣欣特地抽离出代码编成一个叫作Sos的类(SharedObject缩写是SO嘛)。先讲一下欣欣写的这个东东吧。

var so:SharedObject = SharedObject.getLocal("meaoData");

欣欣的Sos类有个唯一属性——so,它是最核心的变量,类型是SharedObject。getLocal用于取得sol文件,如果不存在将被创建。SharedObject有个非常厉害的属性叫data,因为是Object类,所以可以用“so.data.属性”的办法直接赋值,比如:

so.data.author = "tcxx";

但是,一开始欣欣在赋值的时候顺手写成了so.data.author:String=”tcxx”,于是悲壮地编译错误了……略去空空如也的构造函数,直接讲Sos类的几个方法吧,2个公开方法read()和write(),1个私有方法save()。

function read() {
     if (so.data.status=="saved") {
        Main.gameEngine.experience = so.data.experience;
   	Main.gameEngine.gameMap.itemList = so.data.soMap;
        Main.gameEngine.presentItem.presentItemList = so.data.item;
        //trace("sos loaded!");
     }
}

read()的功能是在游戏一开始读入上次保存的进度数据。引入if语句的判断是因为如果是第一次玩《猫岛建设者》,so.data便无法实例化,导致编译错误。


protected function save() {
    so.data.soDate = new Date();
    so.data.status = "saved";
    //trace("sos saved!");
    so.data.experience = Main.gameEngine.experience;
    so.data.soMap = Main.gameEngine.gameMap.itemList;
    so.data.item = Main.gameEngine.presentItem.presentItemList;
}

save()的功能是在游戏结束时保存进度。变量status标记为saved,这样下次玩的时候用read()就可以读入进度了。


function write() {
    save();
    var rs = so.flush();
}

write()的功能是在游戏进行的同时保存数据。flush方法可以更新sol文件。 

在与fla文件绑定的文档类里,定义sos:Sos=new Sos()就OK啦。

附:欣欣Sos类全部代码

package 
{
	import flash.net.SharedObject;
	
	/**
	 * ...
	 * @author TCXX
	 */
	public class Sos
	{
		var so:SharedObject = SharedObject.getLocal("meaoData");
		function Sos() {
			
		}
		
		function read() {
			if (so.data.status=="saved") {
				Main.gameEngine.experience = so.data.experience;
		    	Main.gameEngine.gameMap.itemList = so.data.soMap;
				Main.gameEngine.presentItem.presentItemList = so.data.item;
			    trace("sos loaded!");
			}
			
		}
		
		protected function save() {
			so.data.soDate = new Date();
			so.data.status = "saved";
			trace("sos saved!");
			so.data.experience = Main.gameEngine.experience;
			so.data.soMap = Main.gameEngine.gameMap.itemList;
			so.data.item = Main.gameEngine.presentItem.presentItemList;
		}
		
		function write() {
			save();
			var rs = so.flush();
		}
	}
	
}

评论区

  1. 咖啡之家 2021年1月12日 回复

    干饭啦,干饭啦

  2. raintrue 2013年8月18日 回复

    不仅代码写的整齐,分析的很好,哪像我,以前用C写一整个通讯录就用了一个.C文件一个.H文件,然后就是总分总的作文形式- -。不过if (so.data.status==”saved”) {}我一般会给个else {trace(“A novice”);}

    • 甜菜欣欣 2013年8月18日 回复

      @raintrue:夸得我不好意思,在架构上我还在不断尝试,尽可能有效率、便于回收。trace的内容只在调试的时候可见,而使用变量data.status是修补逻辑bug后发现可以用了,就没有再写else啦

      • raintrue 2013年8月18日

        @甜菜欣欣:我知道呢,不然玩家一玩就说人家是新手多那啥啊,我这样写就是方便自己调试的时候观察是否运行到这一步,如果出错了也方便,个人习惯啦,嘿嘿,我喜欢把能想到的情况都个设计进去

      • 甜菜欣欣 2013年8月18日

        @raintrue:这样的写法很严谨很好很赞呢。其实有时候明明知道那样子做会更好,可惜自己太懒了= =

  3. 追梦的风筝 2013年8月2日 回复

    多说啊,可能空间的问题吧,另外你的图片挂了

    • 甜菜欣欣 2013年8月2日 回复

      @追梦的风筝:谢谢反馈。这是误删EM相册的后遗症,我把图片暂时去掉吧

  4. Jim 2013年7月25日 回复

    站长,你到底是干啥的!!!

  5. fleer 2013年6月12日 回复

    话说博主是学神马的,各种高端。。

    • 甜菜欣欣 2013年6月14日 回复

      @fleer:欣欣是高中生。真要问我学神马,嗯,学政史地数理化……(汗)

  6. justyce 2013年6月12日 回复

    说真的,我见过的编程语言不少,熟悉的也不少!除了VB之外,常见的,比如:C系列,C#,java,delphi,php,都有接触,vb吧,曾经用到过,但那已经很久了,忘光了!你写的,我能看懂,但不确定是什么语言!你提的SharedObject,我猜应该和android里的sharedpreferences差不多,用于保存数据,有轻型的数据库那么强悍吧!

    • 甜菜欣欣 2013年6月12日 回复

      @justyce:这是Actionscript3.0语言,Adobe的Flash和Flex都用这个。语言嘛学上几种,估计就能应对大部分了,虽然我还学过VB可还是不怎么懂php和css…SharedObject类似cookie,如你所说,的确挺强悍的

  7. 楚狂人 2013年6月11日 回复

    很专业的样子啊

    • 甜菜欣欣 2013年6月11日 回复

      @楚狂人:其实我没有系统地学过actionscript,其它语言学过一点,概念还是理解的。SO是看了书以后一点点琢磨的,这篇可以算是学习笔记吧

  8. tiandi 2013年6月11日 回复

    站长比较NB啊

    • 甜菜欣欣 2013年6月11日 回复

      @tiandi:站长还处于摸索阶段,谢谢支持

发表回复

您的电子邮箱地址不会被公开。