1

我正在尝试使用 AS3 构建一个小型 Flash 游戏,在其中我将小怪添加到舞台上,将它们存储在一个数组中,以便在它们被杀死后删除。但是我不断收到以下错误:TypeError: Error #2007: Parameter child must be non-null。

这是我目前的代码:

myMobsBuilder();
var mobsArray:Array = new Array();

function myMobsBuilder():void{
    for(var i:Number=0; i<3; i++){
        this["myMob"+i+":MovieClip"] = new mob();
    lvlHolder.addChild(this["myMob"+i]);
    myMob.x = 200;
    myMob.y = 200;
    mobsArray[i] = myMobs;
    }
}

请注意,我正在尝试为每个新的暴民实例动态创建一个变量名。将所述暴徒的影片剪辑添加到舞台上另一个名为:lvlHolder 的影片剪辑中,并将其定位。然后将所述影片剪辑添加到数组中。这样一来,一旦暴徒被杀死,我就可以从阵列和舞台上删除它们。当然,除非有更好的方法来做到这一点。我已经广泛研究了以下内容:动态创建变量名称,从数组中添加和删除影片剪辑,这是我能想到的最好的,尽管我对 AS3 还很陌生。

对此的任何帮助将不胜感激。

附言。以下是我在另一个函数中使用的删除代码,但这也不是很好:

lvlHolder.removeChild(["myMob"+i]);
mobsArray.splice(i,1); 
4

3 回答 3

2

目前还不清楚您要做什么。this["myMob"+i+":MovieClip"] = new mob();这是无效的(嗯,不是严格无效的,但它不会按照你的想法做)。

这应该有效(编辑:改进代码以更好地符合良好的编码标准):

myMobsBuilder();
var mobsArray:Array = [];
//You can also use a vector here, for possibly improved speed and type safety.
//var mobsArray:Vector.<mob> = new Vector.<mob>();

function myMobsBuilder():void{
    for(var i:int=0; i<3; i++)
    {
        var tmpMob:mob = new mob();
        lvlHolder.addChild(tmpMob);
        tmpMob.x = 200;
        tmpMob.y = 200;
        mobsArray.push(tmpMob);
    }
}
于 2012-06-15T14:15:13.577 回答
0

所以,我假设你的循环通过数组?

for (var i:int = 0; i < mobsAray.length; i++)
{
    var tempMob:mob = mobsArray[i];
    var j:int;

    if (tempMob is too weak to live) //pseudocode
    {
        //now we know which one to kill

        lvHolder.removeChild(tempMob);
        //remove it from view

        j = i;
        //remember its position in the array
    }

    //you can modify the array outside the loop
    mobsArray.splice(j,1);

    //I assumed that you can kill just one mob at the time
    //but if that's not the case you can store indexes in the array
    //and make another loop to remove these from mobsArray
}

请记住在循环遍历数组时不要修改数组。

于 2012-06-15T16:02:08.403 回答
0

您可能会发现仅使用 Sprite 容器而不是数组更简单/更有效(取决于您的需求以及跟踪每个“暴民”的方式)

var mobContainer:Sprite = new Sprite();
lvlHolder.addChild(mobContainer);
var tmpMob:mob;
for(var i:Number=0; i<3; i++){
    tmpMob = new mob();
    mobContainer.addChild(tmpMob);
    tmpMob.x = 200;
    Mob.y = 200;
}

然后对于您的删除代码(如果它发生在 mob 类本身中)只需使用 this.parent.removeChild(this);并像对待数组一样对待精灵。

因此,如果您需要知道有多少 mob 实例,只需使用: mobContainer.numChildren (而不是 array.length)和mobContainer.getChildAt(i)而不是 array[i]

于 2012-06-15T17:16:35.027 回答