在ActionScript3中流畅地处理多个按键

时间:2013-01-04 22:32:53

标签: actionscript-3

我目前正在为平台游戏构建一个引擎,但我注意到ActionScript3在使用多个按键时很难保持流畅。例如;

        function onKeyDown(event:KeyboardEvent):void {
        if (event.keyCode == Keyboard.UP || event.keyCode == Keyboard.W || event.keyCode == Keyboard.SPACE) {
            if (isTouchingGround()) {
                isJumping = true;
                yv = -100;
            }
        } else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.D) {
            if (xv == 0) {
                player.gotoAndPlay(275);
            }
        } else if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.A) {
            if (xv == 0) {
                xv = -24;
            } else if (xv != -120) {
                xv-=2;
            }
        } else if (event.keyCode == Keyboard.RIGHT || event.keyCode == Keyboard.D) {
            if (xv == 0) {
                xv = 24;
            } else if (xv != 120) {
                xv+=2;
            }
        }
    }

因此,如上所列,使用UP(或W或Space)键会触发播放器跳转(单独的onframe事件处理程序处理重力等)。使用RIGHT(或D ..)键触发会增加玩家加速度,再次将其应用于单独的onframe事件处理程序中的玩家。

一切都很好 - 但是当使用多次击键时会出现问题。如果一名球员开始向右移动并且击中跳跃,他将停止加速。同时,他不会按照Keyboard.UP方法的指示减速。相反,他会保持当前的速度不变,直到RIGHT键再次被击中。

简而言之,就像Actionscript开始忽略RIGHT或LEFT移动键的keyboard.down和keyboard.up方法一样,直到它们不再被按下为止。这显然会导致一些非常严格的游戏玩法 - 有没有人愿意与我分享任何解决方案?

1 个答案:

答案 0 :(得分:3)

你的问题在于你的if条件后跟if else条件。删除其他,只有if条件。基本上,如果用户占用空间,那么其他任何条件都不会被测试,因为空间被按下并且它是第一个if语句。所以只需将其他内容从if中删除即可。只需删除正在测试击键的if else条件,处理击键的if语句中的条件。

以下是您的代码应该是什么样的:

function onKeyDown(event:KeyboardEvent):void {
    if (event.keyCode == Keyboard.UP || event.keyCode == Keyboard.W || event.keyCode == Keyboard.SPACE) {
        if (isTouchingGround()) {
            isJumping = true;
            yv = -100;
        }
    }
    if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.D) {
        if (xv == 0) {
            player.gotoAndPlay(275);
        }
    }
    if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.A) {
        if (xv == 0) {
            xv = -24;
        } else if (xv != -120) {
            xv-=2;
        }
    }
    if (event.keyCode == Keyboard.RIGHT || event.keyCode == Keyboard.D) {
        if (xv == 0) {
            xv = 24;
        } else if (xv != 120) {
            xv+=2;
        }
    }
}

您可能会注意到的另一个问题是,当按住UP键和RIGHT键时,计算机似乎会冻结键盘输入,但是当按住W键和D键时,您仍然可以按其他键和计算机将注册他们的输入。这个问题的答案是here

更新

对于流体部分,不是在键击发生时触发某事,而是最好有一个布尔变量,如keyUPUP,如果键是关闭或假,则保持为true钥匙启动时。然后有一个函数onEnterFrame(event:Event):void {},当keyUP为真时执行一个动作。像这样:

import flash.events.*;

public class keyEvents extends MovieClip {
    private var keyRIGHT:Boolean = false;

    public function keyEvents():void
    {
        this.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        this.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
        this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    function onKeyDown(event:KeyboardEvent):void
    {
        if(event.keyCode == Keyboard.RIGHT) {
            this.keyRIGHT = true;
        }
    }

    function onKeyUp(event:KeyboardEvent):void
    {
        if(event.keyCode == Keyboard.RIGHT) {
            this.keyRIGHT = false;
        }
    }

    function onEnterFrame(event:Event):void
    {
        if(this.keyRIGHT) {
            // This code is executed while the RIGHT arrow key is down.
        }
    }
}


如果上面的代码不起作用,我认为你的问题在于你的键盘,而不是它被破坏或者除了制作它之外的任何东西都可能搞砸了。

如果这没有用,请告诉我,我会继续尝试。