0

私は Actionscript3 を初めて使用します。エラーが発生し続ける理由を知る必要がありますParameter child must be non-null。また、私のコードはenemyBlockステージに 5 つのオブジェクトを表示せず、1 つだけ表示します。ヒントやヘルプをいただければ幸いです。前もって感謝します。

戻り値:

 TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChild()
    at flash.display::Stage/addChild()
    at BlockDrop_fla::MainTimeline/EnemyBlockPos()
    at BlockDrop_fla::MainTimeline/frame2()


// declare varibles 
var isEnemyMoving:Boolean = false; 
var enemyArray:Array; 
var enemyBlock:MovieClip = new EnemyBlock(); // assign EnemyBlock class to enemyBlock
var enemyBlockMC:MovieClip; 

var count:int = 5;

var mapWidth:Number = 800;
var mapHeight:Number = 600;

function EnemyBlockPos() :void {

    // assign new MovieClip not null
    enemyBlockMC = new MovieClip;
    enemyArray = new Array();

        for(var i=1; i<= count; i++){ 
            // add class to MC
            enemyBlockMC.addChild(enemyBlock);
            // randomize position
            enemyBlock.x = Math.round(Math.random()*mapWidth);
            enemyBlock.y = Math.round(Math.random()*mapHeight);
            // set motion
            enemyBlock.movement = 5;

            // add MC to array
            enemyArray.push(enemyBlockMC);
        }


        for (var w = 1; w <= enemyArray.length; w++) {
                addChild(enemyArray[w]);
            }

} // endOf EnemyBlockPos
4

2 に答える 2

0

コードをテストしないと、配列に気づきます。1 から開始します。Actionscript 配列は 0 からインデックス付けされているため、for の外観は次のようになります。

for(var i:int = 0; i<= count - 1; i++){ 
        // add class to MC
...

for (var w:int = 0; w <= enemyArray.length -1; w++) {
...

さらに(正気のために)次のことを行います:

enemyArray = []

それ以外の

enemyArray = new Array();

より優れたメモリ管理とオーバーヘッドが得られます。

配列のカウントで修正されるかどうかを確認します-

于 2010-04-26T17:59:56.893 に答える
0

ああ、私はそれを持っていると思います。

あなたのアプローチは問題ありませんが、エラーが発生した場所がわかると思います。私が見る限り、1 つの敵ブロック MC にループするたびに敵ブロックを追加します。次に、その敵ブロック MC を配列に (たとえば) 5 回追加します。

したがって、enemyArray には、enemyBlockMC への 5 つの同じ参照があります。- したがって、2 番目の for ループの各反復で同じ時間に energyBlockMC が発生します。

ステージ上に 5 つの異なる敵ブロックを配置する場合は、次のようにする必要があります。

   for(var i:int =0; i<= count - 1; i++){ 
            // add class to MC
/*
Move this line of code into the for loop, creating a new version every time.
*/
enemyBlockMC = new MovieClip;
/*
Also move this into your loop, ensuring you make a new EnemyBlock() every time
*/
var enemyBlock:MovieClip = new EnemyBlock(); // assign EnemyBlock class to enemyBlock
enemyBlockMC.addChild(enemyBlock);
// randomize position
enemyBlock.x = Math.round(Math.random()*mapWidth);
enemyBlock.y = Math.round(Math.random()*mapHeight);
// set motion
enemyBlock.movement = 5;

// add MC to array
enemyArray.push(enemyBlockMC);
}

そうすれば、enemyArray にプッシュenemyBlockMCするたびに、新しいバージョンのenemyBlock がムービークリップ内にラップされます。

そうは言っても、n番目の数の energyBlocks がすべて新しいバージョンになります。したがってaddChild(enemyArray[w]);、2 番目の for ループでは、毎回新しいバージョンが作成されます。

本質的に(明確にするために)enemyArray[0]は、enemyArray[2]

それが理にかなっていることを願っています。- もう一度説明する必要がある場合は、質問してください。

それがあなたの目的ですか?コードのフォーマットについて申し訳ありません -- o_O

于 2010-04-26T18:45:39.713 に答える