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

配列について少し混乱していると思います。起こっていることは、別の関数によってデータを保存したり、コードの残りの部分と関係があることはありません。

その共有オブジェクトの配列をコピーしようとする方法を単純化すると、2 つの別個のオブジェクトが作成されません。代わりに、常に 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 に答える
0

メモリに読み込まれる sharedObject の内容と、ディスクに保存される内容は別のものです。メモリ内で sharedObject をトレースしています。この sharedObject をフラッシュするまで、おそらくイメージをディスクに保存しません。新しい SharedObject を作成してトレースしてみてください。異なるはずです。

編集:

前に言ったことに誤りがあります (以下のコメントで)。moveSpdUpgrade の新しいインスタンスを作成して、.concat メソッドを使用して共有オブジェクトに配置するように言いました。これが機能しない理由は、moveSpdUpgrade が 2 次元配列であるためです。この詳細を見逃していました。そのため、.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 に答える