0

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

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

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

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

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

感谢您的帮助。

编辑:

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

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

4

2 回答 2

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

希望这会奏效。

于 2012-07-23T23:34:46.080 回答
0

我认为您在数组方面遇到了一些令人困惑的事情。发生的事情永远不会通过另一个函数保存任何数据,也不会与您的其余代码有关。

简单的方法是如何尝试复制该共享对象的数组并不会创建两个单独的对象。相反,您总是在 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
    }
  }
}
于 2012-07-24T13:43:58.903 回答