我试图让蝙蝠角色在我的游戏中删除jack/2/3孩子,但我一直收到错误:ArgumentError #2025。我知道我可能要把一个孩子移走两次?我环顾四周,我对此并不是很有经验,所以我很难理解需要做些什么来解决这个问题。有人能告诉我具体需要对我的代码做些什么吗?
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);
}
}
}发布于 2014-11-13 13:03:47
由于嵌套的bumpit()事件处理程序,如果命中测试没有冲突,则在每个键上都会添加另一个enter frame事件。
KeyboardEvent.KEY_UP上,事件处理程序调用bump(),后者添加将调用bumpIt()的Event.ENTER_FRAME侦听器。bat.hitTestObject()为true,则不删除Event.ENTER_FRAME.Event.ENTER_FRAME监听器在每个frame.上触发bumpIt()
所以,每打开一个键,你就有可能添加另一个帧处理程序。
如果发生了十个key up事件,但都没有命中测试对象,那么您现在将在一帧中调用bumpIt十次。
如果你需要在key up上点击test,只需将逻辑放在那里:
stage.addEventListener(KeyboardEvent.KEY_UP, bump);
function bump(e:KeyboardEvent):void {
if (bat.hitTestObject(jack)) { /* ... */ }
}或者,如果要在关键点上升之后跟踪动画序列,可以添加一些状态变量,例如:
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);
}然后,如果您的命中测试工作正常,并且您删除了帧处理程序,则重置状态变量:
stage.removeEventListener(Event.ENTER_FRAME, bumpIt);
isFlying = false;另一种解决方案是删除嵌套的处理程序。由于您在bump()中嵌套了bumpIt(),因此您将看到由于作用域的原因而导致的回调的累积触发:
function bump():void {
function bumpIt():void { /* ... */ }
}简单地推广bumpIt()
function bump():void { /* ... */ }
function bumpIt():void { /* ... */ }https://stackoverflow.com/questions/26901214
复制相似问题