|
【问题描述】:
flash制作的小游戏,如果要存储游戏的进度,应当如何?
【情景概述】:
flash(swf文件)在运行时,大多数数据都存储在内存中,一旦关闭swf文件,那么这些数据也同时从内存中被自动清除掉。
下一次再打开swf文件时,一切又从头开始了。因此,如果要实现进度读取的功能,就必须想办法把数据存储在Flash播放器外面。
ActionScript中,SharedObject类实现了该功能。
SharedObject有两种类型的共享对象-----本地和远程。本话集中讨论本地存储localsharedobjects(LSOs)。
LSOs很类似于浏览器中cookies,LSOs的功能也和cookies很类似,如存储用户登陆网站的用户名,这样不必每次登陆都要输入用户名了,不过LSOs的功能不仅限于此,它比cookies要强大的多(有兴趣的盆友可以百度一下)。
【解决方案】:
一、舞台上放置一个动态文本,设置实例名为usersValue 因为是用来存数数字的,所以通过“嵌入”按钮嵌入数字
二、舞台上放置一个按钮,用来给usersValue增加数据。按钮的实例名为addBtn
三、新建一个图层,准备写代码的。代码如下:
import flash.net.SharedObject;
var lso:SharedObject = SharedObject.getLocal("justATest");
//初始化数据
if (lso.size == 0)
{
lso.data.chengji = 30;
}
//给舞台上的动态文本进行赋值
usersValue.text = "" + lso.data.chengji;
//通过单击按钮对分数变量(usersValue)每次增加5分
addBtn.addEventListener(MouseEvent.CLICK, djhs);
function djhs(event:MouseEvent):void
{
lso.data.chengji += 5;
usersValue.text = "" + lso.data.chengji;
}
四、测试影片。开始的时候,显示的分数为30 每单击一次按钮,该值增加5分
关闭swf后,再重新测试影片。就会发现分数不再是30了。本地存储的目标达到
【代码讲解】:
1、import flash.net.SharedObject;
该行是flashCS5.5软件自动加上的。当我们书写代码时,CS5.5会自动的将代码中需要导入的类写在最上面
2、var lso:SharedObject = SharedObject.getLocal("justATest");
声明一个SharedObject对象lso【相当于声明一个变量,方便下面的操作。因此,lso的名字可以随便起】,并赋值。通过调用SharedObject的静态方法getLocal()来指定存储文件的文件名justATest ,这个名字是自己随便定义的。
3、if (lso.size == 0)
SharedObject类有一个size属性,返回值就是外部文件的大小(单位是字节)【这个外部文件的类型一定是.sol类型(扩展名是.sol),这个外部文件的名字就是我们自定义的justATest。故而,该外部文件的全名就是justATest.sol。那么,该外部文件被存储在哪里呢?它被存储在C:\Documents and Settings\[当前用户名] \Application Data\Macromedia\Flash
Player\#SharedObjects\[ 随机字符]\[swf文件的文件名]\,随机字符目录命名是为了安全考虑。一些恶意的swf文件可能试图猜测sharedobject(共享对象)的名称或目录,以便从文件系统中读取LSO,进而提升访问权限。因此必须把路径随机化,这样猜路径几乎是不太可能了】
通过一个if判断语句,来实现变量的初始化。若没有这个初始化,首次运行时,会显示undefined
4、lso.data.chengji = 30;
SharedObject类有一个data属性,该属性的类型是object,因此可以添加任何信息上去。我添加了一个名为chengji的属性,这个chengji无需事先定义,而是直接书写于此。我用chengji来存储成绩(数字)。
如果还有其他的变量,也按照相同的格式继续书写即可。比如说:
lso.data.chengji = 30;
lso.data.mingzi = "网雨霏霏";
lso.data.sz = ["电视机","电冰箱","电脑","电吹风"];
5、usersValue.text = "" + lso.data.chengji;
给舞台上的名为usersValue的动态文本进行赋值。则必须使用动态文本的text属性方可。由于该属性的类型是字符串,所以赋值号右方通过一个小技巧来进行赋值(即 通过一个空字符串""和连接符+跟上数字变量,即可实现数字转换成字符串的效果)。当然,我们还可以使用强行转换函数String:
usersValue.text = String(lso.data.chengji);
这个效果和上面的效果完全等价。
6、addBtn.addEventListener(MouseEvent.CLICK, djhs);
function djhs(event:MouseEvent):void
{
lso.data.chengji += 5;
usersValue.text = "" + lso.data.chengji;
}
这是最经典的鼠标单击事件。我想通过单击按钮对分数变量(usersValue)每次增加5分
欢迎光临 flash之路-flash技术交流 (http://flashroad.joinbbs.net/) | Powered by Discuz! 7.2 |