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

removeChild游戏ArgumentError:错误#2025 Flash
EN

Stack Overflow用户
提问于 2014-11-13 12:12:14
回答 1查看 50关注 0票数 1

我试图让蝙蝠角色在我的游戏中删除jack/2/3孩子,但我一直收到错误:ArgumentError #2025。我知道我可能要把一个孩子移走两次?我环顾四周,我对此并不是很有经验,所以我很难理解需要做些什么来解决这个问题。有人能告诉我具体需要对我的代码做些什么吗?

代码语言:javascript
复制
var jack:pumpkin = new pumpkin();
var jack2:pumpkin = new pumpkin();
var jack3:pumpkin = new pumpkin();
var score:Number = 0;

scoreBox.text = String(score);

addChild(jack);
jack.x = 125;
jack.y = 285;

addChild(jack2);
jack2.x = 270;
jack2.y = 310;

addChild(jack3);
jack3.x = 445;
jack3.y = 285;

stage.addEventListener(KeyboardEvent.KEY_DOWN, moveLeft);
stage.addEventListener(KeyboardEvent.KEY_DOWN, moveRight);
stage.addEventListener(KeyboardEvent.KEY_DOWN, moveDown);
stage.addEventListener(KeyboardEvent.KEY_DOWN, moveUp);
stage.addEventListener(KeyboardEvent.KEY_UP, bump);

function moveLeft(e:KeyboardEvent):void {

if (e.keyCode == 37) {
        bat.x -= 5;
    }
}
function moveRight(e:KeyboardEvent):void {

if (e.keyCode == 39) {
        bat.x += 5;
    }
}
function moveDown(e:KeyboardEvent):void {

if (e.keyCode == 40) {
        bat.y += 5;
    }
}
function moveUp(e:KeyboardEvent):void {

if (e.keyCode == 38) {
        bat.y -= 5;
    }
}

function bump(e:KeyboardEvent):void {

    stage.addEventListener(Event.ENTER_FRAME, bumpIt);

    function bumpIt(e:Event):void {

        if (bat.hitTestObject(jack)) {
            stage.removeEventListener(Event.ENTER_FRAME, bumpIt);
            removeChild(jack);
            score++;
            scoreBox.text = String(score);
        }
        if (bat.hitTestObject(jack2)) {
            stage.removeEventListener(Event.ENTER_FRAME, bumpIt);
            removeChild(jack2);
            score++;
            scoreBox.text = String(score);
        }
        if (bat.hitTestObject(jack3)) {
            stage.removeEventListener(Event.ENTER_FRAME, bumpIt);
            removeChild(jack3);
            score++;
            scoreBox.text = String(score);
        }
    }

    }
EN

回答 1

Stack Overflow用户

发布于 2014-11-13 13:03:47

由于嵌套的bumpit()事件处理程序,如果命中测试没有冲突,则在每个键上都会添加另一个enter frame事件。

  • KeyboardEvent.KEY_UP上,事件处理程序调用bump(),后者添加将调用bumpIt()Event.ENTER_FRAME侦听器。
    • 如果bat.hitTestObject()为true,则不删除Event.ENTER_FRAME.
    • If,仍会让Event.ENTER_FRAME监听器在每个frame.

上触发bumpIt()

所以,每打开一个键,你就有可能添加另一个帧处理程序。

如果发生了十个key up事件,但都没有命中测试对象,那么您现在将在一帧中调用bumpIt十次。

如果你需要在key up上点击test,只需将逻辑放在那里:

代码语言:javascript
复制
stage.addEventListener(KeyboardEvent.KEY_UP, bump);

function bump(e:KeyboardEvent):void {
    if (bat.hitTestObject(jack)) { /* ... */ }
}

或者,如果要在关键点上升之后跟踪动画序列,可以添加一些状态变量,例如:

代码语言:javascript
复制
var isFlying:Boolean = false;

stage.addEventListener(KeyboardEvent.KEY_UP, bump);

function bump(e:KeyboardEvent):void {
    // If bat is already flying, don't add another frame handler
    if (isFlying)
        return;

    // Otherwise, indicate bat is now flying and add frame handler
    isFlying = true;

    stage.addEventListener(Event.ENTER_FRAME, bumpIt);
}

然后,如果您的命中测试工作正常,并且您删除了帧处理程序,则重置状态变量:

代码语言:javascript
复制
stage.removeEventListener(Event.ENTER_FRAME, bumpIt);
isFlying = false;

另一种解决方案是删除嵌套的处理程序。由于您在bump()中嵌套了bumpIt(),因此您将看到由于作用域的原因而导致的回调的累积触发:

代码语言:javascript
复制
function bump():void {
    function bumpIt():void { /* ... */ }
}

简单地推广bumpIt()

代码语言:javascript
复制
function bump():void { /* ... */ }
function bumpIt():void { /* ... */ }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26901214

复制
相关文章

相似问题

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