0

エラーが発生します

エラー #2099: 読み込みオブジェクトが十分に読み込まれていないため、この情報を提供できません

as3corelibを使用してオブジェクトをJSONにエンコードしようとすると. 親または子を持たない値オブジェクトのエンコードに成功したので、ライブラリが機能し、その問題が addChild などに関連している可能性があることがわかりました。それはただの推測です。

ボードは次のようにステージに追加されます。

stage.addChild(board);

ボードをステージに追加せずにシリアル化しようとすると、別のエラーが発生します。

undefined
at XML/http://adobe.com/AS3/2006/builtin::copy()
at global/describeTraits()
at global/avmplus::describeType()
at global/flash.utils::describeType()
    ...

ボードクラス:

public class Board extends Sprite
{
    public var board:Array;
    public var blockColor:uint = 0xE3E3E3;
    public var blockLength:uint

    public function Board(blockLength:uint)
    {
        super();
        x = 0;
        y = 0;
        this.blockLength = blockLength;
        //buttonMode = true;
        // Setting up two dim array
        board = new Array(10);
        for (var k:int = 0; k < board.length; k++) 
        {
            board[k] = new Array(10);
        }


        for (var i:int = 0; i < 10; ++i) 
        { 
            for(var j:int = 0; j < 10; ++j)
            {
                var block:Block = new Block(i*blockLength, j*blockLength);  
                board[i][j] = block;
                this.addChild(block); // here I add children
                block.drawBlock(blockLength, blockColor);
                block.addEventListener(MouseEvent.CLICK, blockClicked);
            }
        }           
    }

    ....

}

}

ここに Block のコードがありますが、実際には何もありません。

public class Block extends Sprite
{

    public var cos:int = 5; // test

    public function Block(x:uint, y:uint)
    {
        ...
    }

    public function drawBlock(length:uint, color:uint):void
    {
        ...
    }
}

それはなぜですか?

4

1 に答える 1

1

DisplayObject;の形式をシリアル化しようとしないことをお勧めします。代わりに、ビューが使用する基礎となるデータ (属性) をシリアル化する必要があります。上記のコードから正確な答えを出すのは難しいですが、次のことを考慮してください。

// Simple Model object which represents the BlockView's underlying data.
public class BlockViewModel {
    public var x : Number;
    public var y : Number;
}

// Renders the BlockViewModel on screen.
public class BlockView extends Sprite {
    public var position : BlockViewModel;

    // Constructor requires a BlockViewModel object.
    public function BlockView(position : BlockViewModel) {
        this.position = position;
        draw();
        reposition();
    }

    private function draw() : void {
        // Omitted...
    }

    // Update the block's position based on the model.
    private function reposition() : void {
        this.x = this.position.x;
        this.y = this.position.y;
    }

    // Setter for the block's current position.
    public function setX(value : Number) : void {
        this.position.x = value;
        reposition();
    }
}

BlockViewModel上記の例では、状態を保存したいときにオブジェクトをシリアル化するだけです。

var serailizedBlockData : String = JSON.encode(blockView.position);

次に、データをデシリアライズして、新しい BlockView を再作成できます。

// Convert from JSON -> Object.
var blockData : Object = JSON.decode(serializedBlockData);

// Create and populate a BlockViewModel with the deserialized data.
var position : BlockViewModel = new BlockViewModel();
position.x = blockData.x;
position.y = blockData.y;

// Create a new view using the serialized data.
var blockView = new BlockView(position);

オブジェクトの構築/生成ロジックをFactory メソッドに移動してロジックを分離することで、これをさらに拡張できます。

于 2012-05-22T13:37:34.903 に答える