如何使用画布处理多个按键

2023-12-01

使用类似的东西:

window.addEventListener("keydown", handleFn, true);

我如何能够同时处理多个按键以供多人使用?多人将使用一个键盘,因此可以同时按下 Q 和 P 键来移动屏幕上的不同对象。

我没有keyup尚未处理,想知道是否可以解决这个问题。

到目前为止我的逻辑是这样的:

if keydown == Q
    paddle.left = true;

...

//game loop
if paddle.left == true
    paddle.x -= 1;
    paddle.left = false;

玩家也应该按住按钮。


我一般都是这样做的。首先,您需要一个数组来保存键状态。

var keys=[];

然后设置您的事件侦听器。

// key events
document.body.addEventListener("keydown", function (e) {
    keys[e.keyCode] = true;
});
document.body.addEventListener("keyup", function (e) {
    keys[e.keyCode] = false;
});

下面的操作是将数组中的一项设置为 true 或 false,与该键代码相对应。

然后你只需要使用一些条件来看看按下了什么以及你应该做什么。

    // check the keys and do the movement.
    if (keys[38]) {
        if (velY > -speed) {
            velY--;
        }
    }

    if (keys[40]) {
        if (velY < speed) {
            velY++;
        }
    }
    if (keys[39]) {
        if (velX < speed) {
            velX++;
        }
    }
    if (keys[37]) {
        if (velX > -speed) {
            velX--;
        }
    }

下面是一个演示,您可以在其中四处移动并按下多个按键。使用 wasd 和箭头键。

现场演示

var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d");

canvas.width = canvas.height = 300;

var player1 = {
    x: 50,
    y: 150,
    velY: 0,
    velX: 0,
    color: "blue"
},
player2 = {
    x: 250,
    y: 150,
    velY: 0,
    velX: 0,
    color: "red"
};

var x = 150,
    y = 150,
    velY = 0,
    velX = 0,
    speed = 2,
    friction = 0.98,
    keys = [];

function update() {

    if (keys[38]) {
        if (player1.velY > -speed) {
            player1.velY--;
        }
    }

    if (keys[40]) {
        if (player1.velY < speed) {
            player1.velY++;
        }
    }
    if (keys[39]) {
        if (player1.velX < speed) {
            player1.velX++;
        }
    }
    if (keys[37]) {
        if (player1.velX > -speed) {
            player1.velX--;
        }
    }

    if (keys[87]) {
        if (player2.velY > -speed) {
            player2.velY--;
        }
    }

    if (keys[83]) {
        if (player2.velY < speed) {
            player2.velY++;
        }
    }
    if (keys[68]) {
        if (player2.velX < speed) {
            player2.velX++;
        }
    }
    if (keys[65]) {
        if (player2.velX > -speed) {
            player2.velX--;
        }
    }
    ctx.clearRect(0, 0, 300, 300);
    updatePlayer(player1);
    updatePlayer(player2);
    setTimeout(update, 10);
}

function updatePlayer(player) {
    player.velY *= friction;
    player.y += player.velY;
    player.velX *= friction;
    player.x += player.velX;

    if (player.x >= 295) {
        player.x = 295;
    } else if (player.x <= 5) {
        player.x = 5;
    }

    if (player.y > 295) {
        player.y = 295;
    } else if (player.y <= 5) {
        player.y = 5;
    }

    ctx.fillStyle = player.color;
    ctx.beginPath();
    ctx.arc(player.x, player.y, 5, 0, Math.PI * 2);
    ctx.fill();
}

update();

document.body.addEventListener("keydown", function (e) {
    keys[e.keyCode] = true;
});
document.body.addEventListener("keyup", function (e) {
    keys[e.keyCode] = false;
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用画布处理多个按键 的相关文章

随机推荐

  • 如何在android中获得相机的权限。(特别是Marshmallow)

    嘿 我正在 android studio 中设计一个应用程序 其中我需要相机的许可 我已经包括了
  • GWT div aria-hidden 不隐藏在 IE 中

    我用 GWT 编写了我的登陆页面 在 IE 中 我在其末尾看到了这个空带 我将其涂成绿色 以便您可以看到它 这只发生在 IE 中 我正在使用 IE9 进行测试 Chrome 中不行 Firefox 中不行 Safari 中不行 查看 DOM
  • 按后退按钮后文档已过期

    我有一个名为 a php 的页面 它有一个表单并通过 POST 将数据提交到同一文件 a php 页面加载时没有错误 然后我单击该页面上的任何链接 b php 或 b html 它像往常一样定向到任何页面 然后 当我单击 b php 或 b
  • nodejs child_process exec 'java -version'

    嘿 我正在 nodejs shell 中运行以下代码 exec require child process exec 现在我有 exec var 作为函数 然后我跑 exec java function error stdout stder
  • StorageEvent 在 Excel for Windows 中不起作用

    正如一些现有线程所建议的 例如 one two three 当前的对话框不提供API发送经常消息从主页 例如任务窗格 发送到对话框 所以我必须寻找解决方法 我们保留一个变量message in localStorage 然后我们使对话框选中
  • 空白CSS属性正在给flex带来问题[重复]

    这个问题在这里已经有答案了 我面临的问题是white space nowrap当有弹性容器时 有一个弹性container with flex direction row 其中有两个divsidebar使用设置一定的宽度flex 0 0 7
  • 压缩包含合并提交的前几十个 git 提交

    我有一个具有 root 权限的现有存储库R 然后是几十次提交 包括多次合并 最多X 然后线性历史直至Y 我想压碎一切R to X进入单个提交并强制推送它 我怎样才能做到这一点而不需要花费大量精力重新解决合并问题 或者 这个问题可以表述为更改
  • 使用 pandas 对 Python 中多个数据文件的数据进行平均

    我有 30 个 csv 数据文件 来自我运行的实验的 30 次重复运行 我正在使用熊猫read csv 函数将数据读入 DataFrame 列表 我想从此列表中创建一个 DataFrame 其中包含每列 30 个 DataFrame 的平均
  • 如何在画布中创建撤消功能?

    我有一个 HTML5 画布绘图板 我想创建一个具有撤消功能的按钮 我该怎么做 我的想法是拥有一个数组堆栈 每当您绘制并释放鼠标时 它都会通过推送将画布图像保存到撤消数组堆栈中 但当我尝试时 它并没有真正起作用 有更好的主意吗 先感谢您 va
  • SONAR 问题 - 关闭此 FileInputStream

    如何解决这个 SONAR 问题 关闭此 FileInputStream 提前致谢 File billFile new File filePath try BufferedReader br new BufferedReader new In
  • Angular 2 从外部数据引导应用程序

    如何仅在获取外部数据后加载 Angular 2 应用程序 例如 同一个 html 页面上有外部应用程序 我需要将一些数据传递到我的应用程序服务 想象一下 这就是API URL like some host api 在获取此信息之前 我的应用
  • 如何在jquery中迭代json数据

    如何在jquery中迭代json数据 id 856 name India id 1035 name Chennai id 1048 name Delhi id 1113 name Lucknow id 1114 name Bangalore
  • 具有动态 localName 值的 JacksonXmlRootElement

    我正在更新一个POJO我们映射到XML唯一的区别是有人想要旧的XML还有一些新的 唯一的区别是根包装器名称 所有相同的字段 例如当前根 Xml 标记设置为ExistingName他们想要一个新的值 比如BrandNewName具有所有相同的
  • Kendo-Knockout:调用一个方法,通过网格内的数据绑定从模板更改视图模型属性,打破绑定

    我正在使用 RPNiemeyer 的剑道淘汰库 我有一个剑道网格 里面有剑道模板 在模板中 有一个按钮使用剔除单击绑定 该按钮调用更改 viewModel 的方法 重现步骤 单击网格中的按钮 调用一个方法来更改 viewModel 的属性并
  • C++:指向另一个类函数的函数指针

    我有2节课 class B public int func int i class A public typedef int B fPtr int void run B mB void A run create a pointer fPtr
  • 带有粘性页脚的 3 列 css 布局 - 列 100% 高度?

    结合两个例子我发现 http alistapart com article holygrail http mystrd at modern clean css sticky footer 我想出了这个布局 http jsfiddle net
  • mouseenter mouseleave 并选择

    http jsfiddle net msNhr 当您浏览 aaaaa 时 会显示一个覆盖层 当您尝试从覆盖层中的选择中选择某些内容时 覆盖层会关闭 我怎样才能做到这一点 仅当保留实际覆盖区域时 覆盖才应关闭 Thanks 看看这个小提琴 h
  • JSF h 标签不显示[重复]

    这个问题在这里已经有答案了 使用 Netbeans 在 Glassfish 3 1 2 2 上部署 Web 应用程序 但我的 h 标签均未显示在 Web 上 例如
  • dplyr 可以连接多个列或复合键吗?

    我意识到dplyrv3 0 允许您连接不同的变量 left join x y by c a b 将匹配x a to y b 但是 是否可以加入变量组合 或者我是否必须事先添加复合键 像这样的事情 left join x y by c a c
  • 如何使用画布处理多个按键

    使用类似的东西 window addEventListener keydown handleFn true 我如何能够同时处理多个按键以供多人使用 多人将使用一个键盘 因此可以同时按下 Q 和 P 键来移动屏幕上的不同对象 我没有keyup