0

所以,我有这个游戏,我希望玩家移动,所以当按键按下时我使用了一个tick方法,它创建了2个事件监听器,一个keyup监听器和一个tick。keyup监听器删除它自己并删除tick。刻度包含运动和我假定动画的位置。这是我的代码:

// For every frame //
import flash.events.Event;
import flash.events.TouchEvent;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
var gravity = 0.6;
var floor = 410;
jordan1.y = floor;
jordan1.speedY = floor;
jordan1.impulsion = 10;
var onFloor:Boolean = false;
var keyRight:Boolean = false;
stage.addChild(jordan1);
stage.addChild(leftwall1);
stage.addChild(finish1);
stage.addChildAt(abovedoor, 0);
stage.addChild(left);
stage.addChild(right);
stage.addChild(jump);
addEventListener(Event.ENTER_FRAME, enters);
function enters(e:Event) {
    jordan1.speedY += gravity;
    jordan1.y += jordan1.speedY
    if(jordan1.y > floor) {
        jordan1.speedY = 0;
        jordan1.y = floor;
        onFloor = true;
        if(keyRight == true) {
            jordan1.gotoAndPlay(7);
        }
        if(keyRight == false) {
        jordan1.gotoAndStop(1);
        }
    }
}

function stageup(e:MouseEvent) {
    removeEventListener(Event.ENTER_FRAME,tickleft);
    removeEventListener(Event.ENTER_FRAME,tickright);
    removeEventListener(MouseEvent.MOUSE_UP, stageup);
}
stage.addEventListener(MouseEvent.MOUSE_DOWN, stagedown);
function stagedown(e:MouseEvent) {
    stage.addEventListener(MouseEvent.MOUSE_UP, stageup); 
}



stage.addEventListener(KeyboardEvent.KEY_DOWN, jumpkey);
function jumpkey(e:KeyboardEvent) {
    if(e.keyCode == Keyboard.SPACE) {
       if(onFloor == true)
       {
        jordan1.speedY=-jordan1.impulsion;
        onFloor = false;
        jordan1.gotoAndStop(2);
       }
       }
    }

stage.addEventListener(KeyboardEvent.KEY_DOWN, leftkey);
function leftkey(e:KeyboardEvent) {
if(e.keyCode == Keyboard.LEFT) {
    addEventListener(Event.ENTER_FRAME, leftkeytick);
    stage.addEventListener(KeyboardEvent.KEY_UP, leftkeydown);



}
}
function leftkeydown(e:KeyboardEvent) {
    removeEventListener(Event.ENTER_FRAME, leftkeytick);
    stage.removeEventListener(KeyboardEvent.KEY_UP, leftkeydown);

}
function leftkeytick(e:Event) {
    jordan1.x-=10;
        if(onFloor == true) {
    jordan1.gotoAndStop(3);
    }
    if(onFloor == false) {
        jordan1.gotoAndStop(6);
    }

}





stage.addEventListener(KeyboardEvent.KEY_DOWN, rightkey);
function rightkey(e:KeyboardEvent) {
if(e.keyCode == Keyboard.RIGHT) {
    keyRight == true;
    addEventListener(Event.ENTER_FRAME, rightkeytick);
    stage.addEventListener(KeyboardEvent.KEY_UP, rightkeydown);
}
}
function rightkeydown(e:KeyboardEvent) {
    removeEventListener(Event.ENTER_FRAME, rightkeytick);
    keyRight == false;
    stage.removeEventListener(KeyboardEvent.KEY_UP, rightkeydown);
}
function rightkeytick(e:Event) {
    jordan1.x+=10;
    if(onFloor == true) {
    jordan1.gotoAndPlay(7);
    }
    if(onFloor == false) {
        jordan1.gotoAndStop(5);
    }
}

// Just for this frame //
leftwall1.addEventListener(Event.ENTER_FRAME, leftwall1hit);
function leftwall1hit(e:Event) {
    if(leftwall1.hitTestObject(jordan1)) {
        jordan1.x +=10;
    }
}

abovedoor.addEventListener(Event.ENTER_FRAME, abovedoorhit);
function abovedoorhit(e:Event) {
    if(abovedoor.hitTestObject(jordan1)) {
        jordan1.x-=10;
    }
}

jordan1.addEventListener(Event.ENTER_FRAME, finish1hit);
function finish1hit(e:Event) {
    if(jordan1.x > 960) {
        gotoAndStop(67);

    }
}

所以,当我测试它并按下它时,它会在 7 处停止,而不是播放。请帮忙!谢谢!

4

1 回答 1

0

goto不应该在你的勾号中,否则它们将在每一帧中执行。这解释了为什么它停留在第 7 帧。

而是将它们放在您的KEY_DOWN侦听器中:

animated = false;
stage.addEventListener(KeyboardEvent.KEY_DOWN, rightkey);
function rightkey(e:KeyboardEvent) {
  if(e.keyCode == Keyboard.RIGHT) {
    if(onFloor == true && !animated) {
       jordan1.gotoAndPlay(7);
    }
    if(onFloor == false && !animated) {
        jordan1.gotoAndStop(5);
    }
    animated = true;
    addEventListener(Event.ENTER_FRAME, rightkeytick);
    stage.addEventListener(KeyboardEvent.KEY_UP, rightkeydown);
  }
}
function rightkeydown(e:KeyboardEvent) {
    animated = false;
    removeEventListener(Event.ENTER_FRAME, rightkeytick);
    stage.removeEventListener(KeyboardEvent.KEY_UP, rightkeydown);
}
function rightkeytick(e:Event) {
    jordan1.x+=10;
}

但是您不应该使用带有 keydown 事件的刻度函数。

KEY_DOWN当您按下/a 键时,每帧都会调用它。

如果您无法更改您的逻辑(这对您想要实现的目标不利),您可以标记您的处理程序。通过为您正在收听的每个键设置一个布尔值。然后在你的滴答声中,根据按下的键做你需要做的事情。

keyRight = false;
keyLeft = false;
//... same for all your keys.
// or you could store them in one object for a more dynamic solution.

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
stage.addEventListener(Event.ENTER_FRAME,tick);

function keyDown(e:KeyboardEvent){
    if(e.keyCode === Keyboard.RIGHT && !keyRight){
        keyRight = true;
    }
    else if(e.keyCode === Keyboard.LEFT && !keyLeft){
        keyLeft = true;
    }
    //... same for all your keys.
}

function keyUp(e:KeyboardEvent){
    if(e.keyCode === Keyboard.RIGHT){
        keyRight = false;
    }
    else if(e.keyCode === Keyboard.LEFT){
        keyLeft = false;
    }
    //... same for all your keys.
}

function tick(e:Event){
     if(keyRight) jordan1.x += 10;
     if(keyLeft) jordan1.x -= 10;
     //... etc for all your keys.
}

这个另一个问题KEY_DOWN很好地涵盖了多个主题。

于 2013-02-10T20:18:23.017 回答