【发布时间】:2014-06-23 11:57:19
【问题描述】:
我有一个游戏,在我完成某个级别后,我将该级别的名称放入一个数组中,并将该数组保存到一个 SharedObject(SO)。但是不知何故/某处我搞砸了,因为在关闭并再次打开游戏后,我加载了 SO 数据(以解锁我已经通过的关卡)并且它(加载的数据)总是搞砸了,没有加载它应该加载的内容加载(有时它甚至会给我带来一些错误。)
代码并不难,但我已经研究了很长时间,我需要新的眼光才能看到其中明显的错误。 ***********编辑********** 所以 SO 的代码是这样的
public class LevelsData extends SharedObject
{
public static var LEVELS_DATA:SharedObject = SharedObject.getLocal("save_poi71");
public static function get LoadNamesOfLevelPassed():Array
{
var myLevelsArr:Array = [];
if( LEVELS_DATA.data.PlayedLevels_arr == undefined)
{
myLevelsArr.length = 0;
}
else
{
myLevelsArr = LEVELS_DATA.data.PlayedLevels_arr;
}
return myLevelsArr;
}
public static function set SaveLevel_Names( nameOfLevelPassed:Array ):void
{
LEVELS_DATA.data.PlayedLevels_arr = nameOfLevelPassed;
LEVELS_DATA.flush();
}
}
游戏中的代码是这样的
.
.
.
.
private function didWePlaySameLevel():void
{
var namesPlayed_arr:Array = LevelsData.LoadNamesOfLevelPassed;
var namesTotal:int = namesPlayed_arr.length;
if( namesTotal == 0 )
{
trace(" ScreenInGame_2 | didWePlaySameLevel | namesTotal == 0 so we push Level_1");
namesPlayed_arr.push( Moving_Picture_Name );
LevelsData.SaveLevel_Names = namesPlayed_arr;
sameLevel = false;
}
else if( namesTotal != 0 )
{
for( var i:int = 0; i < namesTotal; i++)
{
trace(" ScreenInGame_2 | didWePlaySameLevel | " + Moving_Picture_Name + " ?==? " + namesPlayed_arr[ i ] );
trace(" ScreenInGame_2 | didWePlaySameLevel | namesPlayed_arr.length = " + namesPlayed_arr.length);
if( Moving_Picture_Name != namesPlayed_arr[ i ] )
{
trace(" ScreenInGame_2 | didWePlaySameLevel | " + Moving_Picture_Name + " != " + namesPlayed_arr[ i ] );
namesPlayed_arr.push( Moving_Picture_Name );
LevelsData.SaveLevel_Names = namesPlayed_arr;
sameLevel = false;
trace(" ScreenInGame_2 | didWePlaySameLevel | namesPlayed_arr.length = " + namesPlayed_arr.length);
}
}
}
}
.
.
.
if( levelsToUnlock < totalLevels && sameLevel == false )
{
trace("ScreenInGame | unlockOneMoreLevel | we UNLOCK 1 more level" );
unlockNextLevel();
}
***编辑问题:
不知怎的,我想出了解决我的第一个问题的方法,但现在有一个新方法,那就是:
当 SO 中的数组为 != 0 时,我进入 else if 语句。我比较了数组中的任何变量是否与 Moving_Picture_Name 具有相同的名称,如果它们不具有相同的名称,则我设置 sameLevel = false。问题是,如果假设我之前已经通过/玩过 5 个级别(Level_1,Level_2,Level_3,Level_4,Level_5)并且假设我再次开始玩 Level_2,它会告诉我这个:
Level_2 != Level_1 -> 它将自己推入数组并更新数据
Level_2 == Level_2 -> 什么都不做
Level_2 != Level_3 -> 它将自己推入数组并更新数据
Level_2 != Level_4 -> 它将自己推入数组并更新数据
Level_2 != Level_5 -> 它将自己推入数组并更新数据
所以它实际上会推送 Array 中已经存在于该 Array 中的 4 个元素。
***问题:
那么,如果 newLevel 的名称不在该数组(我保存名称的位置)中,我该如何推送它,如果该名称已经存在于数组中,我如何什么都不做。
【问题讨论】:
-
您应该提出一个新问题,因为在您进行编辑后,这与从 SharedObject 中提取数据无关。顺便说一句,给出的答案对你正在做的事情有点过分。 ByteArray 实际上应该用于复杂的自定义对象保存,而原始复杂对象可以使用 JSON.stringify() 轻松保存并使用 JSON.decode() 检索,这与您正在使用的数据类型更相关。
标签: arrays actionscript-3 sorting shared-objects