我正在尝试使用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);
答案 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]