AS3 用ShareObject保存数据之后,发布成exe时不能读取数据

我用AS3做了一个游戏,使用ShareObject保存数据到userData之后,在FLASH运行时还是可以保存和读取里面的数据的。但是发布成EXE时读取userData... 我用AS3做了一个游戏,使用ShareObject保存数据到userData之后,在FLASH运行时还是可以保存和读取里面的数据的。但是发布成EXE时读取userData时就显示失败。
有什么方法可以脱离FLASH,发布出的程序移植到别的机器仍可以读取userData的数据?
请各位指教指教

var userData:SharedObject = SharedObject.getLocal("userData");
//假设二维数组为 [5][6]
var xn:Number = 5;
var yn:Number = 8;

///*-------------------------------------------

//定义用户的二维数组
var user:Array = new Array();
//填充二维数组
for (var i=0; i<xn; i++)
{
user[i] = new Array();
for (var j=0; j<yn; j++)
{
user[i][j] = 0;
}
}
user[0][0] = "no1";
user[0][1] = "123";
user[0][2] = "2";
user[1][0] = "no2";
user[1][1] = "456";
user[2][0] = "no3";
user[2][1] = "789";
user[3][0] = "no4";
user[3][1] = "012";
trace(user);
userData.data.gameinfo = user;
展开
 我来答
alanbabbage
推荐于2016-06-26 · TA获得超过978个赞
知道小有建树答主
回答量:755
采纳率:0%
帮助的人:1148万
展开全部

发布成exe后读取数据失败,是因为


var userData:SharedObject = SharedObject.getLocal("userData");这句造成的,因为没有指定路径,所以每一次getLocal时,都默认成文件位置,意思就是说,如果你移动主文件位置后,会新建一个数据存储。


解决办法就是在后面加多一个参数,指定其路径,如


var userData:SharedObject = SharedObject.getLocal("userData","/");


这样,不管你的主文件移动哪个盘符,哪个文件夹里,都能读取到了。


PS:由于http的存储是在对应的域名下面的,所以会读到不同的存储位置,再者是浏览器的差异性也会导致,但同一个浏览器,同一个域名,不管什么时候打开都会读同一个存储位置的。


移植到别的电脑仍然可以读取到数据,由于是本地存储,故要实现这功能,移植时也必须将数据文件打包移植,但需要手动还原(不建议这样做)


本地存储文件一般在(AppData需要在窗口中“工具”->“文件夹选项”->“查看”,勾选上“显示隐藏的文件、文件夹和驱动器”才能看到)

C:\Users\电脑用户名(默认为:Administrator)\AppData\


下,由于不同的系统,其位置也有差异,你可以使用SharedObject来搜索又或者使用你的文件名,如上面代码中的userData,很快就会找到你专属的userData.sol文件了

移植时也带走这个文件,到被移植电脑上,在相同的存储位置上摆放此文件即可读取


注意,最好的方法就是先进行一次播放,之后在此系统中用上面的方法找到userData.sol,再用你移植的userData.sol来覆盖使用。


因为麻烦,所以才不建议,但如果需要移植本地.sol文件的话,只能这样做。


建议方法:


由于你打算使用exe了,即是不需要嵌套在网页中,所以可以考虑使用AIR,AIR中,有File类和FileStream类,可以将数据写到自定义的本地文件中,当然保存的位置是你自定义的,方便吧


假如你保存的位置为安装目录的位置上,那么你移植时,将整个包一起移走就可以在其他电脑上使用同一个数据文件了,跟移动.sol文件不同,这个数据文件不需要寻找和还原。


附上一个简单的AIR保存例子:

import flash.filesystem.*;
import flash.net.registerClassAlias;
var obj:Object = new Object();//保存的数据对象,可以为任何类

/**此句是将类进行注册,之后可以在读取时还原,在保存自定义类时非常好用,
 * 因为stream.readObject得到的是一个Object,无法自动转换成自定义类。
 * 所以,如果保存自定义,而想在读取时也可以还原成这个类的话,需要进行注册一次,
 * 必须是在写入之前进行注册。当然,在读取时也需要进行注册才能还原。
 * */
registerClassAlias("cls", Object);

var f:File = new File(File.applicationDirectory.nativePath + "/自定义文件夹路径或不加/" + "文件名.文件后辍名");//都是自定义的
var stream:FileStream = new FileStream();
try {
stream.open(f, FileMode.WRITE);//open是同步打开,即如果有程序占用文件就会打不开了
}catch (evt:Error) {
trace("文件被其他程序占用!");
return;
}

stream.writeObject(obj);

/**建议写完后,关闭文件,否则会占用*/
try {
stream.close();
}catch (evt:Error) {
trace("无法关闭文件!");
}

/**读取的时候,使用相同的方法,用stream打开文件,打开文件为READ,如*/

stream.open(f, FileMode.READ);

/**读取时*/

stream.readObject();
/**得到的是一个Object类型的数据,如果需要转换成自定义就需要注册类了,上面有提到*/


PS:感觉回答得是不是有点长了?。。。-_-!

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友7588b36
2014-01-08 · TA获得超过2278个赞
知道大有可为答主
回答量:5095
采纳率:40%
帮助的人:1368万
展开全部
用c#嵌入flash的方式生成exe既可以实现
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式