2012-07-23 46 views
0

我遇到了sharedObject flush方法的问题。 swf关闭时是否可以不刷新数据?我的savegame函数是调用flush方法的唯一函数,它还确定哪个数组将进入sharedObject数据的哪个位置。是否有可能无法关闭共享对象?

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

然而,当我修改tempMoveSpdUpgrade阵列,它也保存在共享对象的新数据,即使冲洗尚未调用呢。

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阵列被修改两种方式。

回答

0

我认为你遇到了一些有关数组的问题。 发生了什么事情从来不会通过另一个函数保存任何数据,或者与您的其他代码有关。

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

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 
    } 
    } 
} 
+0

我试着创建一个新的数组moveSpdUpgrade并使用这个保存来代替。 'moveSpdUpgrade = tempMoveSpdUpgrade.concat(); \t \t \t tempMoveSpdUpgrade [0] [0] = 0; \t \t \t trace(moveSpdUpgrade); \t \t \t trace(tempMoveSpdUpgrade);'但是,即使在concat后面更改了这两条曲线,也会显示相同的内容。 – oliboon 2012-07-24 20:18:31

+0

我意识到你的例子是用1维数组。我已经修改它适合我的代码,它现在的作品现在..非常感谢你..我需要刷新阵列显然 – oliboon 2012-07-24 21:00:49

+0

欢迎;)我一遍又一遍地遇到这个问题^^ – Sidrich2009 2012-07-26 00:25:10

0

加载到内存中的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(); 
} 

希望,将工作的功能。

+0

目前,即使我不使用保存按钮调用的flush(),这个阵列中的数据被加载最近所有的修改,而不是所保存的最后一个版本。 – oliboon 2012-07-23 23:40:17

+0

它看起来像是不直接调用flush,“Flash Player在共享对象会话结束时将共享对象写入文件”。我会将数组tempMoveSpdUpgrade的一个新实例放入共享对象中,以便您可以修改tempMoveSpdUpgrade而不影响共享对象。像这样:parentMC.sharedObject.data。moveSpdUpgrade = parentMC.upgrades.tempMoveSpdUpgrade.conact() – hackattack 2012-07-23 23:45:26

+0

奇怪的是,我试图甚至没有关闭瑞士法郎。我只是回到主菜单并加载已保存的游戏。我尝试了你的方法,当数组被修改时,它似乎仍然在修改sharedObject。 – oliboon 2012-07-24 00:02:29

相关问题