【问题标题】:Using dynamic variable names使用动态变量名
【发布时间】:2012-06-18 14:55:06
【问题描述】:

我正在尝试使用 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;
    }
}

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

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

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

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

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    您可能会发现只使用 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)而不是数组[i]

    【讨论】:

    • 嘿,谢谢,但我现在收到此错误:参数 child must be non-null.
    【解决方案2】:

    那么,我假设你的循环通过数组?

    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
    }
    

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

    【讨论】:

    • 嗯,我将尝试使用上面来自 Jonathan 的代码。虽然我不断收到来自 mobs.Array.push(tmpMob); 的错误。部分在那里。
    • 我不断从 Array.push(tmpMob); bit--- 错误 #1009:无法访问空对象引用的属性或方法。
    • 没关系。我是个白痴。我在函数之外有数组声明。 /掌脸
    • 废话,它需要在函数之外才能让其他函数调用它。但是创建函数只有在数组在其中时才有效。奇怪
    • 很高兴我能帮上忙。您介意点赞有帮助的答案并接受最有帮助的吗?
    【解决方案3】:

    目前还不清楚您要做什么。 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);
        }
    }
    

    【讨论】:

    • this["myMob"+i+":MovieClip"] = new mob();
    • 你能显示负责杀死小怪的代码吗?一旦您知道要杀死哪个生物/剪辑,您可以通过多种方式引用它 - 无需为每个剪辑指定名称/ID。
    • lvlHolder.removeChild(["myMob"+i]); mobsArray.splice(i,1);这是我到目前为止所拥有的,但它不起作用。几天来我一直在努力让它发挥作用。附言。移除部分在另一个函数中,每次杀死一个暴徒时都会激活。
    • 如何找到i?这是最有趣的部分。
    • 在创建中它位于 For 循环中。在删除中,它处于一个while循环中。基本上,每当有任何暴徒被击中时,都会循环遍历每个暴徒以检查他们的健康状况。如果他们的生命值为零或低于零,它会将他们标记为死亡,并从舞台和阵列中删除他们。但它不能正常工作:(
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2019-06-08
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多