【问题标题】:fluidly dealing with multiple keypresses in ActionScript3在 ActionScript3 中流畅地处理多个按键
【发布时间】:2013-01-05 09:20:34
【问题描述】:

我目前正在为平台游戏构建引擎,但我注意到 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 开始忽略右或左移动键的 keyboard.down 和 keyboard.up 方法,直到它们不再被按下。这显然会导致一些非常严格的游戏玩法 - 有没有人愿意与我分享这方面的任何解决方案?

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    你的问题在于你的 if 条件后面跟着 if else 条件。删除 else 并只使用 if 条件。基本上,如果用户按住空格,则不会测试其他 if 条件,因为空格被按住并且它是第一个 if 语句。因此,只需将 else 从 if 中删除。只需删除正在测试击键的 if else 条件,not 处理击键的 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 或按键按下时保持 false向上。然后有一个函数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.
            }
        }
    }
    


    如果上面的代码不起作用,我认为你的问题出在你的键盘上,而不是它坏了或其他任何东西,但它的制作方式可能会把事情搞砸。

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

    【讨论】:

    • 哇,对不起,我不敢相信我没有这样做。谢谢! ..但不幸的是,仍然没有快乐。切换到简单的 if 语句,并进行一些跟踪;按下另一个键后,右/ D键根本没有被注册为按下。有什么想法吗?
    • 效果很好——现在我自己的代码中有一些错误需要解决,但感谢您的学习体验! :)
    • 很高兴能为您提供帮助,如果您有任何其他问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多