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

2013-6-10 | 编程日记 | 标签: AS3.0 日记 编程 代码

上个星期特别长,在学校里呆了整整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();
		}
	}
	
}

分享本页面至: Weibo Qzone Facebook Twitter
相关文章

评论区

未显示?点击刷新
raintrue 2013-08-19 00:53

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

甜菜欣欣 2013-08-19 04:33

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

raintrue 2013-08-19 07:29

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

甜菜欣欣 2013-08-19 07:33

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

追梦的风筝 2013-08-02 20:58

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

甜菜欣欣 2013-08-02 21:31

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

Jim 2013-07-25 14:14

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

甜菜欣欣 2013-07-25 17:46

@Jim:无辜的学生党0、0 回复

fleer 2013-06-12 21:47

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

甜菜欣欣 2013-06-14 16:41

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

justyce 2013-06-12 12:05

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

甜菜欣欣 2013-06-12 12:47

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

楚狂人 2013-06-11 16:39

很专业的样子啊 回复

甜菜欣欣 2013-06-11 16:50

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

tiandi 2013-06-11 14:21

站长比较NB啊 回复

甜菜欣欣 2013-06-11 16:01

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

回到顶部