我需要帮助理解Actionscript 3中的父/子关系

时间:2013-04-23 17:29:46

标签: actionscript-3 flash parent-child

我正在为我教过的高中课程编写一些游戏设计教程,并在我用来教授和学习的几个不同文件中继续陷入同样的​​问题。

错误(我确实搜索过这个)是2025“必须是调用者的孩子”错误。为了更好地理解这一点,我创建了一个文件如下。我将通过注意这是一个基于.fla的帧代码来限定,其中我们做的其他工作是在.as文件中。无论如何:

fireButton.addEventListener(MouseEvent.CLICK, fire_fn);
addEventListener(Event.ENTER_FRAME, moveShots);

var speed:int = 20;
var shot:Shot;
var shots:Array=new Array;

function fire_fn(e:Event) {
    shot = new Shot();
    shot.x = gun.x+shot.width;
    shot.y = gun.y;
    addChild(shot);
    shots.push(shot);
}

function moveShots(e:Event) {
    for(var i:int=shots.length-1; i>=0; i--) {
        shots[i].x += speed;
        if(shots[i].x > stage.stageWidth -50) {
           removeChild(shots[i]);
        }
       }
}

我知道问题出在removeChild行中,但我不清楚应该如何编写或者(可能更重要的)为什么。欢迎任何意见。

2 个答案:

答案 0 :(得分:0)

您没有从阵列中移除镜头。因此,下一次循环,将再次满足条件,但镜头将被删除。你需要从镜头阵列中拼接镜头;

试试这个:

function moveShots(e:Event) {
    for(var i:int=shots.length-1; i>=0; i--) {
        shots[i].x += speed;
        if(shots[i].x > stage.stageWidth -50) {
           removeChild(shots[i]);
           shots.splice(i,1);
        }
       }
}

答案 1 :(得分:0)

首先,你应该做一些错误处理。要从父母中移除孩子,孩子实际上必须是该父母的孩子。国家不能让被绑架的孩子远离其实际的父母,只有绑架者(可怕的类比,但这是有道理的)。

因此...

if ( shots[i] is DisplayObject && ( shots[i] as DisplayObject ).parent == this ) {
    this.removeChild( shots[i] );
}

这将确保子节点实际上是一个DisplayObject,并且它的父节点是您要将其从中删除的。这不是实际导致您的问题的原因。删除子项后,还需要将其从阵列中删除。

if ( shots[i] is DisplayObject && ( shots[i] as DisplayObject ).parent == this ) {
    this.removeChild( shots[i] );
    shots.splice( i, 1 );
}