我正在尝试制作一个宇宙飞船游戏,当我使用removeChild()方法将投射物或敌舰移出舞台时,我遇到了问题。
以下是代码的相关部分:
var bulletsArr:Array = new Array();
var eShipsArr:Array = new Array();
for (var c = 0; c < eShipsArr.length; c++){
stage.addChild(eShipsArr[c]);
}
....
stage.addEventListener(KeyboardEvent.KEY_DOWN,shoot);
function shoot (e:KeyboardEvent):void{
if(e.keyCode==17){
var pj:projectile = new projectile();
pj.x = SShip.x;
pj.y = SShip.y;
stage.addChild(pj);
bulletsArr.push(pj);
if(bulletsArr.length >= 10){
bulletsArr = bulletsArr.slice(1,10);
}
}
}
stage.addEventListener(Event.ENTER_FRAME,checkHit);
function checkHit (e:Event):void{
for (var d = 0; d < bulletsArr.length; d++){
for(var f = 0; f < eShipsArr.length; f++){
if(bulletsArr[d].hitTestObject(eShipsArr[f])){
trace(bulletsArr[d].parent);
stage.removeChild(bulletsArr[d]); //ArgumentError: Error #2025!!!!
}
}
}
}当我在stage中使用removeChild()时,跟踪返回null。如果没有它,跟踪将返回Stage object。在这两种情况下,都会出现相同的错误跳转。
发布于 2012-10-20 21:20:20
会不会是您正在尝试删除已删除的子项?
您不会将其从数组中移除,因此下一次循环或下一次checkHit调用将包括对可能已从stage中移除的对象的检查。即使对象不在舞台上,hitTestObject检查也会返回true。
未测试(请注意,在删除数组元素时,将向后迭代项目符号数组,以避免长度问题):
for (var d = bulletsArr.length - 1; d >= 0; d--){
for(var f = 0; f < eShipsArr.length; f++){
if(bulletsArr[d].hitTestObject(eShipsArr[f])){
trace(bulletsArr[d].parent);
stage.removeChild(bulletsArr[d]);
bulletsArr.splice(d, 1); // remove bullet from array
}
}
}编辑:这是一些未经测试(正确键入)的代码,以防一颗子弹可能与两艘或更多艘船相撞,您所需做的就是移除这些子弹:
for(var f:Number = 0; f < eShipsArr.length; f ++)
{
for(var d:Number = bulletsArr.length - 1; d >= 0; d --)
{
if(bulletsArr[d].hitTestObject(eShipsArr[f]))
{
stage.removeChild(bulletsArr[d]);
bulletsArr.splice(d, 1);
}
}
}循环在哪里交换,这样删除的项目符号就不会被再次检查。
如果一颗子弹可能会与两艘或更多的船只相撞,而你也计划对与子弹相撞的船只做一些事情,那么尝试这样做:
for(var d:Number = bulletsArr.length - 1; d >= 0; d --)
{
var bullet:DisplayObject = bulletsArr[d];
var bulletHitSomething:Boolean = false;
for(var f:Number = 0; f < eShipsArr.length; f ++)
{
if(bullet.hitTestObject(eShipsArr[f]))
{
if(!bulletHitSomething)
{
bulletHitSomething = true;
stage.removeChild(bullet);
bulletsArr.splice(d, 1);
}
// do other, ship specific stuff here
}
}
}当前的bullet对象引用存储在一个变量中,所有的检查都是使用数组访问针对该变量而不是数组中的元素进行的。与数组访问方法不同,在数组访问方法中,它可能访问不存在的索引,这种方法可能会连续检查相同的项目符号。此外,变量还存储了子弹是否已经击中某物,这样它就不会再次尝试移除该子弹。
https://stackoverflow.com/questions/12988170
复制相似问题