上个星期特别长,在学校里呆了整整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(); } } }
干饭啦,干饭啦
不仅代码写的整齐,分析的很好,哪像我,以前用C写一整个通讯录就用了一个.C文件一个.H文件,然后就是总分总的作文形式- -。不过if (so.data.status==”saved”) {}我一般会给个else {trace(“A novice”);}
@raintrue:夸得我不好意思,在架构上我还在不断尝试,尽可能有效率、便于回收。trace的内容只在调试的时候可见,而使用变量data.status是修补逻辑bug后发现可以用了,就没有再写else啦
@甜菜欣欣:我知道呢,不然玩家一玩就说人家是新手多那啥啊,我这样写就是方便自己调试的时候观察是否运行到这一步,如果出错了也方便,个人习惯啦,嘿嘿,我喜欢把能想到的情况都个设计进去
@raintrue:这样的写法很严谨很好很赞呢。其实有时候明明知道那样子做会更好,可惜自己太懒了= =
多说啊,可能空间的问题吧,另外你的图片挂了
@追梦的风筝:谢谢反馈。这是误删EM相册的后遗症,我把图片暂时去掉吧
站长,你到底是干啥的!!!
@Jim:无辜的学生党0、0
话说博主是学神马的,各种高端。。
@fleer:欣欣是高中生。真要问我学神马,嗯,学政史地数理化……(汗)
说真的,我见过的编程语言不少,熟悉的也不少!除了VB之外,常见的,比如:C系列,C#,java,delphi,php,都有接触,vb吧,曾经用到过,但那已经很久了,忘光了!你写的,我能看懂,但不确定是什么语言!你提的SharedObject,我猜应该和android里的sharedpreferences差不多,用于保存数据,有轻型的数据库那么强悍吧!
@justyce:这是Actionscript3.0语言,Adobe的Flash和Flex都用这个。语言嘛学上几种,估计就能应对大部分了,虽然我还学过VB可还是不怎么懂php和css…SharedObject类似cookie,如你所说,的确挺强悍的
很专业的样子啊
@楚狂人:其实我没有系统地学过actionscript,其它语言学过一点,概念还是理解的。SO是看了书以后一点点琢磨的,这篇可以算是学习笔记吧
站长比较NB啊
@tiandi:站长还处于摸索阶段,谢谢支持