AS3 用ShareObject保存数据之后,发布成exe时不能读取数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AS3 用ShareObject保存数据之后,发布成exe时不能读取数据相关的知识,希望对你有一定的参考价值。
我用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;
发布成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:感觉回答得是不是有点长了?。。。-_-!
本回答被提问者和网友采纳 参考技术B 用c#嵌入flash的方式生成exe既可以实现在 testMovie 命令之后,如何让 JSFL 将跟踪输出保存到文件中?
【中文标题】在 testMovie 命令之后,如何让 JSFL 将跟踪输出保存到文件中?【英文标题】:How to do I get JSFL to save trace output to a file AFTER a testMovie command? 【发布时间】:2012-12-06 05:11:13 【问题描述】:我正在尝试为我们的一种产品自动执行单元测试。它基于 ActionScript,但我们没有 FlashBuilder。我们使用 Jenkins 来完成我们所有的自动输出,我可以让文件正常工作,并创建和渲染 AS 单元测试 FLA 文件的 testMovie。这样做会将测试结果输出到跟踪输出面板。我使用 JSFL simlar 来运行这个 flash 文件
var folderPath = path/to/folder/file.fla
if (fl.fileExists(folderPath))
fl.openDocument(folderPath);
fl.getDocumentDOM().testMovie;
fl.getDocumentDOM().close(false);
fl.outputPanel.save("file:///C:/testJSFL/output.txt");
不幸的是 outputPanel.save 在 testMovie 输出被放置为跟踪操作之前运行,我还没有通过许多 Google 搜索找到一种方法,以了解如何让系统等待电影运行以保存此文件。我什至尝试多次打开和关闭文件。任何帮助,将不胜感激。
【问题讨论】:
【参考方案1】:确保 testMovie 被作为函数调用并保存输出 before 关闭:
var folderPath = path/to/folder/file.fla
if (fl.fileExists(folderPath))
fl.openDocument(folderPath);
fl.getDocumentDOM().testMovie();
fl.outputPanel.save("file:///C:/testJSFL/output.txt");
fl.getDocumentDOM().close(false);
【讨论】:
不幸的是,我试图保存的输出来自 SWF 的执行。因此,即使您采用这种设置方式,它的工作方式与我上面的一样,并且不会向 output.txt 文件输出任何文本。问题似乎是没有办法告诉 JSFL 在保存输出之前等待 SWF 文件完成。 :(虽然我会说你的操作顺序比我在问题中提出的要好。 如果您需要延迟,您可以在 SWF 面板中使用它并在 ActionScript 中使用 setTimeout 来运行 JSFL 代码(通过 MMExecute)。相反,您可以在您的测试 SWF 中使用 LocalConnection 来触发您的 SWF 面板,然后它会调用 JSFL。 这很好用,贾斯汀。抱歉,我花了这么长时间才回复您。延迟正是我所需要的。以上是关于AS3 用ShareObject保存数据之后,发布成exe时不能读取数据的主要内容,如果未能解决你的问题,请参考以下文章