0

我正在为我教的一个高中课程编写一些游戏设计教程,并且在我用来教学和学习的几个不同文件中一直卡在同一个问题上。

错误(我确实搜索过)是 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 行,但我不清楚应该如何编写或者(可能更重要的是)为什么。欢迎任何意见。

4

2 回答 2

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);
        }
       }
}
于 2013-04-23T17:35:07.517 回答
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 );
}
于 2013-04-23T17:37:34.073 回答