0

私はまだ AS3 でコーディングすることを学んでいますが、これはかなり単純明快で Java に似ているように思えます。

質問のタイトルに従って、次のようにグリッドに印刷できるように、既に作成した MovieClip の 2D (ネストされた) 配列を作成しようとしています。

var NumCols:Number = 8;
var NumRows:Number = 8;
var ColWidth:Number =  (stage.stageWidth-8)/NumCols;
var ColHeight:Number = (stage.stageWidth-8)/NumRows;
var GemMatrix:Array = new Array( 8, 8 );
var n = 1;
var SW:Number = stage.stageWidth;
var SH:Number = stage.stageHeight;

private function GJ_GenerateBoard(event:MouseEvent):void {
// Initialization...
for (var j = 0; j < NumRows; ++j)
{
    GemMatrix[y] = [];
    for (var i = 0; i < NumCols; ++i)
    {
        trace(i,j);
        GemMatrix[i][j] = new Gem() as MovieClip;
        this.addChild(GemMatrix[i][j]);
        GemMatrix[i][j].x = i*ColWidth+ColWidth/2;
        GemMatrix[i][j].y = j*ColHeight+ColHeight/2;
    }
}

私が受け取っているエラーは次のとおりです。

ReferenceError: Error #1056: Cannot create property 0 on Number.

これは、新しい Gem() インスタンスを作成しようとしているときに発生します。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

0

var GemMatrix:Array = new Array( 8, 8 );

これがあなたを手に入れたものです。これは実際には [Number(8), Number(8)] である 1D 配列を作成します。AS3 で配列の長さを定義する必要はありません。設定方法は次のとおりです。

var GemMatrix:Array = [];

for (var i:int = 0; i < NumCols; i++){
    var $a:Array = [];
    for (var m:int = 0; m < NumRows; m++){
        var $gem:MovieClip = new Gem();
        $gem.x = i*ColWidth+ColWidth/2;
        $gem.y = j*ColHeight+ColHeight/2;
        addChild($gem);

        $a.push($gem);
    }
    GemMatrix.push($a);
}

また、この行は奇妙です: GemMatrix[y] = []; これがエラーをスローしない唯一の理由は、y が現在拡張しているクラスの動的プロパティであり、その y 位置 (おそらく this.y = 0) を示しているためです。

于 2012-05-06T17:10:34.150 に答える