2012-07-23 49 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

相關問題