0

Im having a game where after I finish a certain level I put that level`s name In an Array and save that array to an SharedObject(SO). But somehow/somewhere I mess up things, because after closing and opening the game again, I load the SO data (to unlock the levels that I have passed) and it is (the loaded data) always messed up and not loading what it should load(sometimes it even trows some errors at me.)

The code is not that difficult but I have been looking at it for far to long and I need new eyes to see the obvious mistakes in it. ***********EDIT********** So the code for the SO is this

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();
    }
}

and the code in the game is this

.
.
.
.



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();
}

***EDIT PROBLEM:

SomeHow i figured a way of solving my 1st problem, but now there is a new one and that is :

When the Array from the SO is != 0 i go into the else if statement. There i compare if any of the variables in the Array have the same name of the Moving_Picture_Name and if they dont then I set the sameLevel = false. The problem is that, if lets say I have passed/played 5 levels before( Level_1,Level_2,Level_3,Level_4,Level_5 ) and lets say I start playing Level_2 again it would show me this:

Level_2 != Level_1 - > and it will push itself into the Array and update the data

Level_2 == Level_2 - > it will do nothing

Level_2 != Level_3 - > and it will push itself into the Array and update the data

Level_2 != Level_4 - > and it will push itself into the Array and update the data

Level_2 != Level_5 - > and it will push itself into the Array and update the data

so it will actually push 4 Elements in the Array that exist already in that Array.

***THE QUESTION :

So how do I push the newLevel only if its name isnt in that Array(the one where I save the names), And how do I do nothing if the name exist in the Array already.

GregorII
  • 221
  • 4
  • 13
  • 1
    You should ask a new question since after your edits this has nothing to do with extracting data from SharedObject anymore. Btw the answer given is somewhat overkill for what you are doing. ByteArray should in fact be used for complex custom object saving while primitive complex objects can easily be saved using JSON.stringify() and retrieved using JSON.decode() which is more relevant given the type of data you are working with. – BotMaster Jun 23 '14 at 23:55

1 Answers1

0

You may have to convert your array to ByteArray, and save that. When you read it back, you will have to do the reverse operation. StackOverflow example link

Community
  • 1
  • 1
Black Dynamite
  • 4,067
  • 5
  • 40
  • 75
  • hmmm thats some very helpful info, but i somehow almost figured it out .Yet there is one thing to solve.Ill Edit my question so you can see what Im struggling with now. @FlexFiend – GregorII Jun 23 '14 at 17:34