使用动态变量名称

时间:2012-06-15 14:11:57

标签: actionscript-3

我正在尝试使用AS3构建一个小型Flash游戏,我将怪物添加到舞台上,将它们存储在数组中以便在它们被杀死后进行删除。但是我一直收到以下错误: TypeError:错误#2007:参数child必须为非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;
    }
}

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

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

聚苯乙烯。以下是我在另一个函数中使用的删除代码,但是效果不好:

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

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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
}

请记住在循环播放时不要修改数组。

答案 2 :(得分:0)

您可能会发现使用Sprite容器而不是数组更简单/更有效(取决于您的需求以及如何跟踪每个'mob')

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);并像处理数组那样处理精灵。

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