actionscript-3 - 流畅地处理 ActionScript 3 中的多个按键

标签 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)键会触发玩家跳跃(单独的帧内事件处理程序处理重力等)。使用右(或 D..)键触发器会增加玩家加速度,这会在单独的帧内事件处理程序中再次应用于玩家。

一切正常,但当使用多次击键时就会出现问题。如果玩家开始向右移动并点击跳跃,他将停止加速。同时,他不会按照 Keyboard.UP 方法中的指示减速。相反,他将保持当前速率不变,直到再次按下右键。

简而言之,就好像 Actionscript 开始忽略向右或向左移动键的 Keyboard.down 和 Keyboard.up 方法,直到不再按下它们为止。这显然会导致一些非常僵化的游戏玩法 - 有没有人愿意与我分享这个问题的解决方案?

最佳答案

您的问题在于 if 条件后面跟着 if else 条件。删除 else 并只使用 if 条件。基本上,如果用户按住空格,则不会测试其他 if 条件,因为空格被按住并且这是第一个 if 语句。因此,只需将 if 中的 else 去掉即可。只需删除正在测试击键的 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 .

更新:

对于流体部分,最好使用一个 bool 变量,例如 keyUPUP 来保存 true if当按键向上时,按键处于按下状态或 false。然后有一个函数 onEnterFrame(event:Event):void {},当 keyUP 为 true 时执行操作。就像这样:

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.
        }
    }
}


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

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

关于actionscript-3 - 流畅地处理 ActionScript 3 中的多个按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14166083/

相关文章:

ios - 使用 AIR 在 iOS 上流式传输 AAC+(在 FLV 内)

android - Air iOS/Android 推送通知记住应用程序启动时

mysql - 更新数据库 - FLEX

flash - 加载器不会加载大图像

actionscript-3 - 如何在旋转的 tilemap 中查找屏幕边界的 tile 索引?

apache-flex - ActionScript:包级内省(introspection)?或者其他一些可插入的加载方案?

javascript - 如何使用 RegExp 保持大小写?

apache-flex - 如何使用 Flash (AS3) 从远程域调用 Flex SWF?

actionscript-3 - 如何在 Actionscript 3 中将十六进制转换为十进制?

actionscript-3 - 用于 AS3 中匿名函数的 removeEventListener