【问题标题】:Is it possible not to flush sharedobject on close?关闭时是否可以不刷新共享对象?
【发布时间】:2012-07-23 23:26:30
【问题描述】:

我在使用 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 的 cmets 中所说,当我不保存但 moveSpdUpgrade 数组被修改时,钱是正确的数据。

【问题讨论】:

    标签: actionscript-3 shared-objects


    【解决方案1】:

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

    简单的方法是你尝试复制共享对象的数组不会创建两个单独的对象。相反,您总是在 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
        }
      }
    }
    

    【讨论】:

    • 我尝试创建一个新数组 moveSpdUpgrade 并使用这个数组来代替。 moveSpdUpgrade = tempMoveSpdUpgrade.concat(); tempMoveSpdUpgrade[0][0] = 0; trace(moveSpdUpgrade); trace(tempMoveSpdUpgrade); 但是,即使在 concat 之后发生了更改,这两个跟踪也显示相同的内容。
    • 我意识到你的例子是一个一维数组。我已经修改了它以适合我的代码,现在它可以工作了.. 非常感谢.. 我显然需要刷新数组
    【解决方案2】:

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

    编辑:

    我发现我之前告诉你的操作有错误(在 cmets 下方)。我告诉过您使用 .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();  
    }
    

    希望这会奏效。

    【讨论】:

    • 目前,即使我不使用调用flush()的保存按钮,这个数组中的数据也会加载所有最近的修改,而不是最后保存的版本。
    • 如果您不直接调用flush,看起来就像“当共享对象会话结束时,Flash Player 将共享对象写入文件”。我将创建一个数组 tempMoveSpdUpgrade 的新实例以放入您的共享对象,这样您就可以修改 tempMoveSpdUpgrade 而不会影响共享对象。像这样: parentMC.sharedObject.data.moveSpdUpgrade = parentMC.upgrades.tempMoveSpdUpgrade.conact()
    • 奇怪的是我正在尝试甚至没有关闭 swf。我只是返回主菜单并加载保存的游戏。我试过你的方法,修改数组的时候好像还在修改sharedObject。
    • 这很奇怪。如果您发布更多代码,我可以尝试进一步帮助您,但给出的信息是我能做的最好的。祝你好运。
    • 我发现了一些奇怪的东西,当我调用我的保存游戏功能时,我也为玩家省钱。即使使用与 moveSpdUpgrade 数组相同的方法和相同的函数保存此变量,它也会显示正确的数量。由于某种原因,当 saveGame 函数没有被调用但数组被调用时,money 变量没有被保存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多