简体   繁体   English

如何同时使用两个 onkeydown 事件?

[英]how to use two onkeydown events at the same time?

I'm trying to build a pong game, and I want the boards to be able to move simultaneously (one with the 's' and 'w' and the other with the up and down arrows).我正在尝试构建一个乒乓球游戏,并且我希望棋盘能够同时移动(一个带有“s”和“w”,另一个带有向上和向下箭头)。

            function movePlayer1(event) {
                if (player1.y > 7.5 && player1.y < 390) {
                    switch (event.keyCode) {
                        case 83: player1.y += player1.v;
                            break;
                        case 87: player1.y -= player1.v;
                            break;
                    }
                }
                else if (player1.y <= 7.5) {
                    switch (event.keyCode) {
                        case 83: player1.y += player1.v;
                            break;
                    }
                }
                else if (player1.y >= 390) {
                    switch (event.keyCode) {
                        case 87: player1.y -= player1.v;
                            break;
                    }
                }
            }
            document.addEventListener("keydown", movePlayer1, false);

            function movePlayer2() {
                if (player2.y > 7.5 && player2.y < 390) {
                    switch (event.keyCode) {
                        case 40: player2.y += player2.v;
                            break;
                        case 38: player2.y -= player2.v;
                            break;
                    }
                }
                else if (player2.y <= 7.5) {
                    switch (event.keyCode) {
                        case 40: player2.y += player2.v;
                            break;
                    }
                }
                else if (player2.y >= 390) {
                    switch (event.keyCode) {
                        case 38: player2.y -= player2.v;
                            break;
                    }
                }
            }
            document.addEventListener("keydown", movePlayer2, false);

I've tried putting them in one function instead but it didn't help.我试过将它们放在一个函数中,但没有帮助。

There are two things make you code behave not as you expect.有两件事使您的代码行为不像您期望的那样。

Autorepeating works only for last pressed key.自动重复仅适用于最后按下的键。 Say if you press "A" and hold it autorepeating will generate keydown events for "A".假设您按“A”并按住它,自动重复将为“A”生成按键事件。 But if you press "B" and hold both autorepeating will generate sequential keydown automatically for "B" only.但是,如果您按“B”并按住两个自动重复将仅为“B”自动生成顺序按键。 On the other side I believe for MacOS it will not autorepeat at all so better not rely on this.另一方面,我相信对于 MacOS,它根本不会自动重复,所以最好不要依赖于此。

But actually "keyup" are triggered correctly even if mutliple keys were pressed and are hold.但实际上,即使按下并按住多个键,“keyup”也会正确触发。

So you can refactor your code: instead of relying on keyup/keydown only you need some timer and each player model will be所以你可以重构你的代码:而不是依赖于 keyup/keydown,你只需要一些计时器,每个玩家模型都将是

{
  directionIsUp: true | false,
  isMoving: true | false
}

So on keydown you are setting appropriate direction and make isMoving to be true .因此,在keydown您正在设置适当的方向并使isMovingtrue And on keyup you are making isMoving to be false.而在keyup您正在使isMoving为假。

And timer will re-render your battlefield accordingly to those models - either moving player or keeping it at the same place.计时器将根据这些模型重新渲染您的战场 - 移动玩家或将其保持在同一位置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM