我正在设计具有保存和加载功能的游戏。使用SharedObject技术,我成功地保存了大部分变量。但是,有一个词典有时最终会被定义为" undefined"。这可能是我加载游戏时间的1/3。
这是我的保存功能。它大约每2.秒运行一次。我删除了很多代码行,因为它们不相关(保存其他变量)。跟踪线用于调试目的。每次,也是当上面提到的错误诅咒,这条线路工作。因此,字典不是未定义的#34;此刻。
private function saveGame():void
{
so = SharedObject.getLocal("progress", "/");
so.data.saved = true;
so.data.airportDict = airportDict;
trace(dayCount, so.data.airportDict["Australia"]);
so.flush();
}
每次打开程序时都会运行以下行。目的是确定是否有要加载的已保存文件。
so = SharedObject.getLocal("progress", "/");
if (so.data.saved == true)
{
loadProgress();
}
else
{
airportDict = new Dictionary();
resetAirportDict(); // This function just add lots of data to the dictionary.
}
最后,加载功能:
private function loadProgress():void
{
so = SharedObject.getLocal("progress", "/");
airportDict = so.data.airportDict;
trace("Successfull start? " + airportDict);
}
如前所述,机场词典的价值是"未定义"也许是我运行程序的1/3。没有任何原因。这是一个谜。
答案 0 :(得分:0)
SharedObject可以存储基本类型+数组和对象类型。对于其他复杂类型,您必须使用registerClassAlias()注册要存储的类。在您的情况下,Dictionary是一种复杂类型,默认情况下不由SharedObject +处理,您可能使用的复杂对象也必须注册。因此,您使用的任何复杂类都必须注册,否则SharedObject将失败。
registerClassAlias("YourClassName", YourClassName);
这段代码产生错误,因为SharedObject不理解复杂的对象:
var shareddata:SharedObject = SharedObject.getLocal("mydata")
var instance:MyClass;
if(shareddata.data["instance"] == undefined)
{
instance = new MyClass();
shareddata.data["instance"] = instance;
}
else
{
instance = shareddata.data["instance"];
}
但您可以通过注册课程轻松修复它:
import flash.net.registerClassAlias;
registerClassAlias("MyClass", MyClass);
var shareddata:SharedObject = SharedObject.getLocal("mydata")
var instance:MyClass;
if(shareddata.data["instance"] == undefined)
{
instance = new MyClass();
shareddata.data["instance"] = instance;
}
else
{
instance = shareddata.data["instance"];
}
//no error and you truly get back your custom class instance the second time around.