2013-04-23 44 views
0

我正在为一所高中班级编写一些游戏设计教程,并且在我用来教授和学习的几个不同文件中一直困在同一个问题上。我需要帮助了解操作脚本3中的父母/子女关系

错误(我确实搜索过)是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之,但我并不清楚应该怎样书写或(可能更重要的)原因。任何输入是受欢迎的。

回答

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

这工作!而且,我相信,解决了我为学生开发更具吸引力的游戏设计所遇到的问题。谢谢! – 2013-04-23 19:54:38

+0

太棒了,如果你需要更多的帮助,请告诉我。我的电子邮件位于我的个人资料中,我提供辅导。 – prototypical 2013-04-23 20:00:10

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

他的循环已经进入了相反的状态,所以'我 - '是不需要的。如果它向上计数,那将是需要的。在这种情况下,'i - '实际上会导致一个对象被跳过。 – prototypical 2013-04-23 18:35:27

+0

@原型Woops。接得好。我很少编写后退的循环,因此我从不考虑检查其他开发人员是否这样做。我会更新我的答案。感谢您指出这一点 – 2013-04-23 18:41:20

+0

我倾向于像这样的事情前进。还要注意的是,在检查DisplayObject是否具有期望的父项时,只要有充分的理由,它可能就没有价值。但在这样的情况下,它也可以帮助一个bug逃避你。如果其中一个镜头不在显示列表中,但它是您阵列的一个元素,这是我可能想要了解的一个问题。通常是一个更大的问题的症状。 – prototypical 2013-04-23 18:52:30