мувиклип в массиве отображает ноль и не отображается на stage.addChild (Array [i]) - PullRequest
0 голосов
/ 26 апреля 2010

Я новичок в Actionscript3, мне нужно знать, почему я получаю ошибку Parameter child must be non-null.И мой код не будет отображать 5 enemyBlock объектов на сцене, а только один.Любые советы и помощь будут высоко оценены.заранее спасибо.

Возвращает:

 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

Ответы [ 2 ]

0 голосов
/ 26 апреля 2010

О, чувак, я думаю, что у меня есть.

Ваш подход в порядке, но я думаю, что вижу, где происходит ошибка. Насколько я вижу, вы добавляете блок врага каждый раз, когда зацикливаетесь на одном блоке врага Блока - затем вы добавляете этот блок врага в массив (например,) 5 раз.

, следовательно, вы будете иметь 5 одинаковых ссылок на блок врага в блоке врага. - Таким образом, у вас будет вражеский блок в одно и то же время, каждый шаг за секунду для цикла.

Если вы намеревались иметь 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 в вражеский массив, это новая версия вражеского блока, заключенная в видеоклип.

С учетом вышесказанного у вас будет n число вражеских блоков, все из которых являются новыми версиями. Поэтому, когда вы наберете addChild(enemyArray[w]); в своем втором цикле for, у вас будет новая версия каждый раз.

По сути (чтобы уточнить) enemyArray[0] - это совершенно другой объект, чем enemyArray[2]

Надеюсь, это имеет смысл. - Если тебе нужно, чтобы я объяснил это снова, просто спроси.

Это то, что вы собирались? Извините за форматирование кода - o_O

0 голосов
/ 26 апреля 2010

Не проверяя код, который я заметил, ваш массив вы начинаете с одного - массив ActionScript индексируется с 0, в результате чего ваш внешний вид равен

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();

дает вам лучшее управление памятью и накладные расходы.

Посмотрим, исправит ли подсчет массивов -

...