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

Actionscript 3 我需要帮助理解Actionscript 3中的父/子关系,actionscript-3,flash,parent-child,Actionscript 3,Flash,Parent Child,我正在为我教的一个高中班级编写一些游戏设计教程,并且在我用来教和学的几个不同的文件中不断遇到相同的问题 错误(我确实搜索了这个)是2025“必须是调用方的子对象”错误。为了更好地理解这一点,我创建了一个文件,如下所示。我将通过指出这是一个基于.fla的帧代码来限定,我们所做的其他工作是在一个.as文件中。无论如何: fireButton.addEventListener(MouseEvent.CLICK, fire_fn); addEventListener(Event.ENTER_FRAME,

我正在为我教的一个高中班级编写一些游戏设计教程,并且在我用来教和学的几个不同的文件中不断遇到相同的问题

错误(我确实搜索了这个)是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这一行,但我不清楚该如何写,或者(可能更重要的是)为什么。欢迎任何输入。

您没有从阵列中删除快照。因此,下一次通过循环时,该条件将再次满足,但该快照已被删除。需要从快照阵列拼接快照

试试这个:

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);
        }
       }
}

首先,您应该做一些错误处理。若要从父级中删除子级,该子级实际上必须是该父级的子级。国家不能把一个被绑架的孩子从他们的父母身边带走,只有绑架者(可怕的类比,但这是有道理的)

所以

这将确保子对象实际上是一个DisplayObject,并且它的父对象就是您要从中删除它的对象。但这并不是导致你问题的真正原因。删除子级后,还需要将其从阵列中删除

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

他的循环已经反向运行,因此不需要
i--
。如果是向上计数,那就需要这样做。在这种情况下,
i--
实际上会导致跳过一个对象。@prototypical Woops。抢手货我很少写回溯的循环,所以我从不想检查其他开发人员是否也这样做。我会更新我的答案。谢谢你指出我也倾向于这样做。还需要注意的是,在检查DisplayObject是否具有预期的父对象时,只要有充分的理由说明其可能不具有值,则该父对象可以具有该值。但是在这种情况下,它也可以帮助一个bug避开你。如果您的一个快照不在显示列表中,但它是数组的一个元素,那么这可能是我想知道的一个问题。通常是一个更大问题的症状。虽然上面的阵列问题解决了我的问题,但我也将探索此解决方案,以了解更多信息并了解其工作原理。啊,我刚拿到。我只尝试了第一个代码部分中的部分,但仍然出现错误。添加拼接完成交易。我还使用了另一个测试,该测试在给我提供信息(父项为root1)时,导致了另一个错误。把它拿出来,现在这个也能用了。谢谢这成功了!而且,我相信,解决了我在为我的学生开发更具吸引力的游戏设计时遇到的问题。谢谢太好了,如果你需要更多的帮助,请告诉我。我的电子邮件在我的个人资料中,我确实提供辅导。
if ( shots[i] is DisplayObject && ( shots[i] as DisplayObject ).parent == this ) {
    this.removeChild( shots[i] );
    shots.splice( i, 1 );
}