首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArgumentError: removeChild时修复错误#2025

ArgumentError: removeChild时修复错误#2025
EN

Stack Overflow用户
提问于 2012-10-20 19:54:40
回答 1查看 327关注 0票数 1

我正在尝试制作一个宇宙飞船游戏,当我使用removeChild()方法将投射物或敌舰移出舞台时,我遇到了问题。

以下是代码的相关部分:

代码语言:javascript
复制
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。在这两种情况下,都会出现相同的错误跳转。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-20 21:20:20

会不会是您正在尝试删除已删除的子项?

您不会将其从数组中移除,因此下一次循环或下一次checkHit调用将包括对可能已从stage中移除的对象的检查。即使对象不在舞台上,hitTestObject检查也会返回true

未测试(请注意,在删除数组元素时,将向后迭代项目符号数组,以避免长度问题):

代码语言:javascript
复制
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
        }
    }
}

编辑:这是一些未经测试(正确键入)的代码,以防一颗子弹可能与两艘或更多艘船相撞,您所需做的就是移除这些子弹:

代码语言:javascript
复制
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);
        }
    }
}

循环在哪里交换,这样删除的项目符号就不会被再次检查。

如果一颗子弹可能会与两艘或更多的船只相撞,而你也计划对与子弹相撞的船只做一些事情,那么尝试这样做:

代码语言:javascript
复制
    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对象引用存储在一个变量中,所有的检查都是使用数组访问针对该变量而不是数组中的元素进行的。与数组访问方法不同,在数组访问方法中,它可能访问不存在的索引,这种方法可能会连续检查相同的项目符号。此外,变量还存储了子弹是否已经击中某物,这样它就不会再次尝试移除该子弹。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12988170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档