- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于我是新手,所以我的低效编码给大家带来了巨大的麻烦,对此我提前表示歉意。
我正在尝试在 HTML5 Canvas 上使用 Javascript 制作一个非常基本的游戏,但我似乎找不到一种简单的方法来“检查”多个用户输入。
我已经成功地将 addEventListener 用于单人游戏。然而,当试图使其成为多人游戏时,一切都崩溃了。我不确定使用 'keydown' addEventListener 两次是否有效。
基本上,游戏会使用 WASD 键检查第一个玩家的答案,并使用箭头键检查第二个玩家的答案。
我目前有以下代码片段,该代码与 p2Game 的函数完全相同ga.addEventListener('keydown', check2, false)
:
function p1Game() {
ga.addEventListener('keydown', check1, false);
blankp1screen();
p1Time = 0;
switch(random[p1Level]) {
case 1: // if the answer is UP, we will display DOWN
p1drawTriangleDown();
p1correctkeyID = 87; // answer for UP (W) key
break;
case 2: // if the answer is DOWN, we will display UP
p1drawTriangleUp();
p1correctkeyID = 83; // answer for DOWN (S) key
break;
case 3: // if the answer is LEFT, we will display RIGHT
p1drawTriangleRight();
p1correctkeyID = 65; // answer for the LEFT (A) key
break;
case 4: // if the answer is RIGHT, we will display LEFT
p1drawTriangleLeft();
p1correctkeyID = 68; // answer for the RIGHT (D) key
break;
}
function check1(e) {
p1tt += p1Time;
if (e.keyCode == 87 || e.keyCode == 83 || e.keyCode == 65 || e.keyCode == 68) { // Checks if user enters the keys we want
p1Answer = e.keyCode; // Stores the key to check
if (p1correctkeyID == p1Answer) { // If the answer is the correct answer...
if (p1Level < maxlevel) { // ...if we're not on level 10, we'll continue!
blankp1screen();
p1correctkeyID = null;
p1Answer == null;
p1Levelup();
if ((p1Level - p2Level) == checkforafk) {
p2Slow();
} else {
p1Game();
}
} else if (p1Level == maxlevel) { // if we're on the max level, we'll let the player win!
p1Win();
}
} else if (p1correctkeyID !== p1Answer) {
p1Lose(); }
}
}
ga.removeEventListener('keypress', check1, false);
}
对于 p2Game:
function p2Game() {
ga.addEventListener('keydown', check2, false);
p2Time = 0;
blankp2screen();
switch(random[p2Level]) {
case 1: // if the answer is UP, we will display DOWN
p2drawTriangleDown();
p2correctkeyID = 38; // answer for UP (W) key
break;
case 2: // if the answer is DOWN, we will display UP
p2drawTriangleUp();
p2correctkeyID = 40; // answer for DOWN (S) key
break;
case 3: // if the answer is LEFT, we will display RIGHT
p2drawTriangleRight();
p2correctkeyID = 37; // answer for the LEFT (A) key
break;
case 4: // if the answer is RIGHT, we will display LEFT
p2drawTriangleLeft();
p2correctkeyID = 39; // answer for the RIGHT (D) key
break;
}
function check2(e) {
p1tt += p2Time;
if (e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 37 || e.keyCode == 39) { // Checks if user enters the keys we want
p2Answer = e.keyCode; // Stores the key to check
if (p2correctkeyID == p1Answer) { // If the answer is the correct answer...
if (p2Level < maxlevel) { // ...if we're not on level 10, we'll continue!
blankp2screen();
p2correctkeyID = null;
p2Answer == null;
p2Levelup();
if ((p2Level - p1Level) == checkforafk) {
p2Slow();
} else {
p2Game();
}
} else if (p2Level == maxlevel) { // if we're on level 10, we'll let the player win!
p2Win(); // Max Level! Congratulations!
}
} else if (p2correctkeyID !== p2Answer) {
p2Lose();
}
}
}
ga.removeEventListener('keypress', check2, false);
}
最佳答案
如果没有运行示例进行调试,很难说清楚。但首先,如果您运行代码两次,每个玩家都会有两个监听器。如果运行三次,就会得到三次,依此类推。这是因为您要为 keydown
事件添加事件监听器,但随后要删除 keypress
,这基本上意味着您永远不会删除 keydown
处理程序。
我的建议是,你不应该在不同的地方处理两个输入,一开始看起来很容易,但它会在你的代码中产生“同步”问题,因为你必须在处理中处理玩家 1 的状态玩家 2 的代码。因此,只需一个事件处理代码,然后针对每种情况执行您需要执行的操作。我认为如果您使用良好的抽象,您最终会得到更容易理解的代码(我知道您说您正在从编程开始,所以这就是为什么我建议您应该遵循一种更容易推理的方法现在)。
关于Javascript 按键 addEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47236137/
我想在按下按钮时打开一个表单,然后在完成表单后创建另一个按钮以将数据存储在对象中。 我这样做了,但在第二个 addEventListener 中它给了我这个错误: cannot read proper
这是我实际代码的简化版本。 有三个复选框和按钮(每个编号为 0、1、2)和一个提交按钮。简而言之,如果您选中复选框编号 1 和 2,单击提交,按钮 1 和 2 将被着色。现在您可以单击任何彩色按钮,它
问题代码 var el = document.getElementById("searchcharm_'"+touch_id+"'"); el.addEventListener('click',
window.document.addEventListener = function(event) {...} window.addEventListener = function(event) {
这段代码块有什么区别: var xhr = new XMLHttpRequest(); xhr.upload.addEventListener("progress", uploadProgress,
在使用 PhoneGap 时,它有一些使用 document.addEventListener 的默认 JavaScript 代码,但我有自己的代码使用 window.addEventListener
当我运行这段代码时,为什么 .body 事件先触发? document.addEventListener('click', function() { console.log('The docume
我将带有循环的 addEventListener 添加到一些 anchor 元素 products 中,如下所示: for(var j=0;j
所以我的代码可以按我想要的方式工作,但是大多数(IE 除外)调试器都会向我抛出此错误: 未捕获类型错误:无法读取未定义的属性“addEventListener” 这是代码: //Get all ele
我真的不知道为什么这不起作用。在我的 HTML 中,如果我将脚本放在 head 部分,我会在控制台中收到以下错误: Uncaught TypeError: Cannot read property '
在 React 中,当你有一个带有 onClick 属性的元素时,很容易使用 Enzyme 的 .simulate("click") 方法来点击它。然而,在我的代码库中有一个示例,其中一个元素被 Re
问候,由于某种原因,当我单击按钮时,我的 -addEventListener 没有执行。任何人都可以帮忙这是我的代码: function elNegro() { alert("Thank Yo
我正在将我的一些代码从 onClick 更改为 addEventListener,因为我已经阅读了各种好处,并且出于关注点分离的目的。然而,我遇到的问题之一是,虽然使用 onClick,我能够调用一个
我正在尝试向我在循环中生成的某些元素添加事件监听器。我必须使用 div.lastChild - 虽然在这个例子中它非常愚蠢。但这只是演示: var func = function() {
我在将事件监听器添加到 JS 时遇到问题...如果我将按钮与 onclick 属性连接,它会起作用,但如果我在 HTML 中删除它并尝试添加 eventListener('click', myFunc
我不知道为什么,但是当我点击“按钮”时什么也没有发生... 控制台中没有消息,没有错误。如何解决? JS var bird = (function(){ let button = doc
我正在绘制一个方框网格,希望能够单击每个方框并使用 SocketIO 将带有其 ID 的通知发送到服务器 let boxes = document.querySelecto
我想是新手问题。 以下代码是我在文档就绪时调用的函数的一部分。它旨在在鼠标移动时永久返回当前鼠标位置的值。 正在发生的奇怪事情:在文档就绪时移动鼠标不会将任何内容记录到控制台。我知道 mouse_mo
我是 Flash 的新手,我似乎无法完成这个简单的操作。 (我正在使用 ActionScript 3.0) 我在我的编辑器中创建了一个输入文本框。实例名称是“测试”。在我的 Action 编辑器中,我
我有一个像 那些标签包含一些内容,我想打开/关闭它们,但仅使用纯 javascript。我已经尝试过使用 document.querySelectorAll
我是一名优秀的程序员,十分优秀!