【问题标题】:extracting Array data from SharedObject从 SharedObject 中提取数组数据
【发布时间】: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


【解决方案1】:

您可能需要将数组转换为 ByteArray,然后保存。当你读回来时,你将不得不做相反的操作。 StackOverflow example link

【讨论】:

  • 嗯,这是一些非常有用的信息,但不知何故,我几乎想通了。但还有一件事要解决。我编辑我的问题,这样你就可以看到我现在正在努力解决什么问题。 @FlexFiend
猜你喜欢
  • 1970-01-01
  • 2014-07-05
  • 2012-10-24
  • 2014-12-21
  • 1970-01-01
  • 2023-03-11
  • 2014-07-30
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多