2

「widgetArray」と呼ばれるウィジェット (私が作成したクラス) の配列を共有オブジェクトに保存しています。

savedGame1.data.widgetArray = widgetArray;

このデータをロードしてウィジェットを使用すると、問題が発生します。配列は正常に保存されますが、各ウィジェットはオブジェクトとして保存されます。だから私は単純にできません:

widetArray = savedGame1.data.widgetArray;

ウィジェットを使用しようとすると:

widgetArray[0].someWidgetFunction();

フラッシュはそれらをオブジェクトと見なすため、機能しません。ウィジェットをロードするときにウィジェットを型キャストしようとしましたが、null オブジェクトしか生成されません。

widgetArray[i] = widgetArray[i] as Widget;//widgetArray[i] becomes null
tempWidget:Widget = widgetArray[i] as Widget;//null as well

この質問はフォーラムの 1 つで友人から寄せられたものですが、回答がなかったので、ここが適切な場所だと思いました... 他の人はこれにどのように対処していますか?

4

2 に答える 2

2

ウィジェットを保存およびロードできる 2 つのメソッドを作成します。save メソッドはウィジェット クラスからデータを取得し、それを共有オブジェクトに保存します。load クラスは共有オブジェクトからデータを取得し、オブジェクトのプロパティを設定します。

このようなもの :

public function save():Object
{
   return {
      "x":this.x,
      "y":this.y,
      "otherStuff":otherStuff
   };
}

public function load(data:Object):void
{
  this.x = data.x;
  this.y = data.y;
  this.otherStuff = data.otherStuff;
}   

save メソッドを呼び出して結果を配列に保存し、それを共有オブジェクトに保存できます。クラスのすべてのプロパティではなく、ウィジェット クラスの再構築に必要なデータのみを保存する必要があります。

編集: BlueRajaのコメントに基づいて更新。

BlueRaja が指摘したように、 IExternalizable はこれに使用するためのものです。

このようなクラスがある場合:

public class MyClass implements IExternalizable
{
    private var one:int = 1;
    private var two:int = 2;

    public function MyClass() 
    {
    }

    public function writeExternal(output:IDataOutput):void
    {
        output.writeInt(one);
        output.writeInt(two);
    }

    public function readExternal(input:IDataInput):void
    {
        one = input.readInt();
        two = input.readInt();
    }

    public function print():void
    {
        trace(one);
        trace(two);         
    }
}

次に、次のように保存できます。

registerClassAlias("MyClass", MyClass);

var sharedObject:SharedObject = SharedObject.getLocal("so");

var myClass:MyClass = new MyClass();    
sharedObject.data['storedObject'] = myClass;    
sharedObject.flush();

それをロードするには:

registerClassAlias("MyClass", MyClass);

var sharedObject:SharedObject = SharedObject.getLocal("so");

var loadedClass:MyClass = sharedObject.data['storedObject'] as MyClass;
loadedClass.print();

それが役立つことを願っています。

于 2012-05-28T13:12:12.480 に答える
-1

http://tush.wordpress.com/2007/07/08/actionscript-3-serializing-classes-using-registerclassalias/ ... これは、カスタム クラス オブジェクトを共有オブジェクトに保存するための本物の方法でもあります。

于 2012-06-09T08:39:40.323 に答える