从SharedObject中提取Array数据

时间:2014-06-23 11:57:20

标签: arrays actionscript-3 sorting shared-objects

我有一个游戏,在我完成某个级别之后,我将该级别的名称放在一个数组中并将该数组保存到SharedObject(SO)。但不知怎的/某处我弄乱了东西,因为在关闭并再次打开游戏之后,我加载SO数据(解锁我已经通过的级别)并且它(加载的数据)总是搞砸了并且没有加载它应该的东西加载(有时它甚至会给我带来一些错误。)

代码并不是那么困难,但我一直在关注它,我需要新眼睛才能看到明显的错误。 的 *********** EDIT ********** 所以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 - &gt;它会将自己推入数组并更新数据

Level_2 == Level_2 - &gt;它什么都不做

Level_2!= Level_3 - &gt;它会将自己推入数组并更新数据

Level_2!= Level_4 - &gt;它会将自己推入数组并更新数据

Level_2!= Level_5 - &gt;它会将自己推入数组并更新数据

所以它实际上会推送数组中已存在的4个元素。

***问题:

那么如果newLevel的名称不在该Array中(我保存名称的那个),我该如何推送newLevel呢?如果该名称已存在于Array中,我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可能必须将数组转换为ByteArray,并保存它。当您回读它时,您将不得不进行相反的操作。 StackOverflow example link