有可能不在关闭时刷新sharedobject吗?

时间:2012-07-23 23:26:31

标签: actionscript-3 shared-objects

我遇到了sharedObject flush方法的问题。当swf关闭时,是否可以不刷新新数据?我的savegame函数是调用flush方法的唯一函数,它还确定哪个数组在sharedObject数据中的位置。

parentMC.sharedObject.data.moveSpdUpgrade = parentMC.upgrades.tempMoveSpdUpgrade;
parentMC.sharedObject.flush();

但是,当我修改tempMoveSpdUpgrade数组时,即使尚未调用flush,它也会将新数据保存在sharedObject中。

tempMoveSpdUpgrade[0][2] = 1;
trace(parentMC.sharedObject.data.moveSpdUpgrade);

此跟踪显示数据已更改但我不明白,因为尚未调用flush并且swf尚未关闭。我想知道为什么在数组中进行的修改会自动更改sharedObject数据。

感谢您的帮助。

编辑:

public function saveGame(){  
    parentMC.sharedObject.data.money = parentMC.money;  
    parentMC.sharedObject.data.moveSpdUpgrade = parentMC.upgrades.tempMoveSpdUpgrade;  
    parentMC.sharedObject.flush();  
}

就像我在hackattack的评论中所述,当我不保存时,钱是正确的数据但是moveSpdUpgrade数组被修改为。

2 个答案:

答案 0 :(得分:0)

加载到内存中的sharedObject和保存到光盘的内容是分开的。您正在跟踪内存中的sharedObject。在您刷新此sharedObject之前,它可能不会将其图像保存到光盘。尝试创建一个新的SharedObject并跟踪它,它应该是不同的。

修改

我看到我之前告诉你的错误(在评论下面)。我告诉过你使用.concat方法创建一个新的moveSpdUpgrade实例放在你的共享对象中。这不起作用的原因是因为moveSpdUpgrade是一个二维数组,我错过了这个细节。因此,调用.concat会创建一个新实例,但新实例仍然填充了对数组的引用以及您正在编辑的那些数组。所以要解决这个问题,我们必须对moveSpdUpgrade进行深度复制。这是一个将完成

的功能
function array2DConcat(target : Array) : Array {
    var buff : Array = new Array(target.length);
    for(var i : int = 0;i < target.length;i++) }
        buff[i] = target[i].concat();
    }
    return buff;
}

然后如果您将方法更改为

public function saveGame(){  
    parentMC.sharedObject.data.money = parentMC.money;  
    parentMC.sharedObject.data.moveSpdUpgrade = array2DConcat(parentMC.upgrades.tempMoveSpdUpgrade);  
    parentMC.sharedObject.flush();  
}
希望这会奏效。

答案 1 :(得分:0)

我认为你对阵列有点混乱。 发生的事情永远不会通过其他功能保存任何数据,或者与代码的其余部分有关。

简单的方法如何尝试复制Sharedobject的数组并不会创建两个单独的Obejcts。相反,您总是在sharedObject-array上工作。

package
{
  import flash.display.Sprite;

  public class arraytester extends Sprite
  {

    private var a:Array = new Array(1,2,3,4,5);
    private var b:Array = new Array("a","b","c","d","e","f");

    public function arraytester()
    {

    // Both arrays are different Objects
        trace(a); // 1,2,3,4,5
        trace (b); //a,b,c,d,e,f

    // Both arrays are pointing to the same Object
        a= b;
        trace(a); //a,b,c,d,e,f
        trace (b); //a,b,c,d,e,f

        b[1] = 2;
        trace(a); //a,2,c,d,e,f
        trace (b); //a,2,c,d,e,f

    // a is a copy of b while becoming a seperate Object
        a = b.concat();
        b[0]= 1;
        trace(a); //a,2,c,d,e,f
        trace (b); //1,2,c,d,e,f
    }
  }
}