免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
Board logo

标题: [AS3技巧集] AS3技巧集:2.flash游戏进度存储--SharedObject类 [打印本页]

作者: 网雨霏霏    时间: 2019-3-17 22:10     标题: AS3技巧集:2.flash游戏进度存储--SharedObject类

本帖最后由 网雨霏霏 于 2019-3-17 22:11 编辑

【问题描述】:

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


[attach]1369[/attach]

四、测试影片。开始的时候,显示的分数为30  每单击一次按钮,该值增加5分

关闭swf后,再重新测试影片。就会发现分数不再是30了。本地存储的目标达到


【本例源码下载】:
本帖隐藏的内容需要回复才可以浏览

使用flashCS5.5方可打开(flashCS6也可以)



【代码讲解】:

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分


作者: 网雨霏霏    时间: 2019-8-13 12:33

求关注.....





欢迎光临 flash之路-flash技术交流 (http://flashroad.joinbbs.net/) Powered by Discuz! 7.2