Actionscript 3 as3中的键盘事件重复执行

Actionscript 3 as3中的键盘事件重复执行,actionscript-3,actionscript,flash-cs5,Actionscript 3,Actionscript,Flash Cs5,我是AS3语言的新手。我想问一下,as3中的KeyboardEvent是否在按下键的情况下就会执行? 在为我的角色执行双跳时,这给了我一个问题。 以下是我的一些代码: var dbJump:Boolean=true; var onGround:Boolean=false; var Yvel:Number=0; var keyUp:Boolean=false; this.addEventListener(Event.ENTER_FRAME,Eframe); stage.addEventListen

我是AS3语言的新手。我想问一下,as3中的KeyboardEvent是否在按下键的情况下就会执行? 在为我的角色执行双跳时,这给了我一个问题。 以下是我的一些代码:

var dbJump:Boolean=true;
var onGround:Boolean=false;
var Yvel:Number=0;
var keyUp:Boolean=false;
this.addEventListener(Event.ENTER_FRAME,Eframe);
stage.addEventListener(KeyboardEvent.KEY_DOWN, 
kDown) 
stage.addEventListener(KeyboardEvent.KEY_UP, 
kUp) 
function kDown(e:KeyboardEvent):void{
    var key:uint=e.keyCode;
    if(key==32){
       keyUp=true;
    }
}
function kUp(e:KeyboardEvent):void{
    var key:uint=e.keyCode;
    if(key==32){
        keyUp=false;
    }
}
function Eframe(e:Event):void{
    Yvel++;
    myChar.y+=Yvel;
    while(ground.hitTestPoint(myChar.x,myChar.y,true)){
        myChar.y--;
        Yvel=0;
    }
    if(ground.hitTestPoint(myChar.x,myChar.y+3,true)){
        onGround=true;
        //if touching ground then return the dbJump to true;
        dbJump=true;
    else{
        onGround=false;
        if(!keyUp){
            //if not on ground an not pressed space, dbJump 
            // still true
            dbJump=true;
        }
    }
    if(keyUp && dbJump && onGround){
        Yvel=-12;
    }
    // if space pressed and not on the ground
    else if(keyUp && dbJump && !onGround){
        Yvel=-12;
        //then say doublejump is completed
        dbJump=false;
        trace(dbJump);
    }
}
因此,dbJump变量在第一次按空格键时立即变为false,而不是在第二次按空格键时变为false。我放置了跟踪,这样我可以看到有多少键关闭事件重复。 关键是,当我的角色离开地面时,dbJump立即变成了假的。我还没有释放钥匙。我试着快速按下并释放空格键,结果它成功了(因此我确信这是因为重复的“dbJump=false”语句)。 如何解决这个问题?
另外,我的意思是,如果dbJump属性为false,则表示无法再次跳转/doublejump已完成。

这不是因为键盘,而是因为Eframe方法每秒运行多次,因此在释放键后和再次按下键之前,它会设法运行几次。因此,第一次运行时,第一个条件通过,下一次运行时,onGround属性已经是假的(我猜)第二个条件通过了。嗯,我在另一个flash文档中尝试添加键盘类型的监听器,但没有使用ENTER_FRAME事件处理程序。现在仍然是这样。很抱歉onground属性。我忘了在那里包含我的触地条件。所以最好忽略itas@Organi指出的,问题不是键盘事件,而是WN只会在每次状态更改时触发一次,问题在于enterFrame方法中的逻辑相当混乱,而我们正在这样做:请用小写字母启动变量和方法。这在AS3中很常见,不会弄乱语法高亮显示。@Yudhis您需要使用有限状态机模式: