0

我是 Actionscript3 的新手,我需要知道为什么我不断收到错误消息Parameter child must be non-null。而且我的代码不会enemyBlock在舞台上显示 5 个对象,而只会显示一个。任何提示和帮助将不胜感激。提前致谢。

回报:

 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

没有测试我注意到你的数组的代码,你从一个开始 - 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

哦,伙计,我想我有它。

你的方法很好,但我想我知道错误发生在哪里。据我所见,每次循环到一个enemyBlockMC 时,您都会添加一个enemyBlock - 然后将该enemyBlockMC 添加到数组中(例如)5 次。

因此,在enemyArray 中,您将拥有对enemyBlockMC 的5 个相同引用。- 因此,在第二个 for 循环中的每次迭代中,您都会同时拥有enemyBlockMC。

如果您打算在舞台上有 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);
}

这样,每次你推enemyBlockMC入你的敌人数组时,都会有一个新版本的enemyBlock 被包裹在一个影片剪辑中。

话虽如此,您将拥有第n个敌人块,其中都是新版本。因此,当您addChild(enemyArray[w]);进入第二个 for 循环时,每次都会有一个新版本。

本质上(澄清)enemyArray[0]是一个完全不同的对象enemyArray[2]

希望这是有道理的。- 如果你需要我再解释一遍,尽管问。

那是你的目的吗?对不起代码格式——o_O

于 2010-04-26T18:45:39.713 回答