如何处理2D平台游戏中的复杂输入?

时间:2017-04-23 09:58:21

标签: javascript input html5-canvas keyboard-events

我正在尝试使用JavaScript在2D平台游戏中为我的角色添加键盘控制。角色可以walk, dash and jump。这是我目前的代码:

if(keyboard['LEFT']) {
    //walk to left
    //...
} else if (keyboard['RIGHT']) {
    //walk to right
    if(keyboard['SHIFT'] && !jump) {
        //dash
    }
    if(keyboard['JUMP']) {
        //jump to right 
    }
    if(keyboard['SHIFT'] && keyboard['JUMP']) {
        //dash and jump (move further and faster)
    }
    if(keyboard['JUMP'] && keyboard['SHIFT']) {
        //hold the right key, pressed jump key, and then pressed shift key
        //it expected to jump to right here, because character can not dash 
        //in midair, but it will conflict the if condition above.
    }
} else if (keyboard['JUMP'] && onGround) {
    //jump
} else if (keyboard['SHIFT']) {
    //dash
    if(keyboard['JUMP']) {
        //dash and jump
    }
}

我很困惑我的代码中有很多if()else()语句,似乎我需要控制键盘输入的顺序。是否有一种简单的方法来处理它?我是否正确的方式?如果没有,实现这一目标的常用方法是什么?请,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

好的,我会尽量保持这个简短,因为我是JS的菜鸟。以下答案基于jQuery而不是原始JS 你在这里尝试做的基本上是处理多个击键,所以你可以尝试如下:

 var map = {}; // You could also use an array
 onkeydown = onkeyup = function(e){
       e = e || event; // to deal with IE
       map[e.keyCode] = e.type == 'keydown';
       /* Put your conditional statements here */
 }

现在,在放置条件语句的位置,您可以使用switch case或使用if..else。如下所示:

 if(map[17] && map[16] && map[65]){ // CTRL+SHIFT+A
       alert('Control Shift A');
 }else if(map[17] && map[16] && map[66]){ // CTRL+SHIFT+B
       alert('Control Shift B');
 }else if(map[17] && map[16] && map[67]){ // CTRL+SHIFT+C
       alert('Control Shift C');
 }

注意 this是我从中提取上述代码段的最佳答案。

我建议你仔细阅读答案,因为它已经详细解释,并且有很多错误修复和改进,当你在开发游戏的过程中肯定会帮助你。请务必阅读评论。

更新:

假设您匆忙或者不想编写自己的代码然后进行测试和调试,那么还有很多其他的js库可以让您的生活更轻松一些。其中一些是 mousetrap.js jwerty.js keypress.js 等列出here

相关问题