一个画布多人游戏,我无法按下超过4个按钮。
一个画布多人游戏,我无法按下超过4个按钮。
我正在尝试学习关于canvas和canvas游戏的知识,目前(或多或少地)在按照W3Schools的canvas游戏教程进行学习。
在教程的某个地方,我想到了制作两个玩家,它们都应该使用同一个键盘进行控制(不是在线多人游戏)。
所以我按照教程给出的逻辑,找到了WASD和箭头的键码。
我理解了我的代码的95%,这意味着我不仅仅是复制了所有的代码,还理解了它。 (我很快会回到这个问题上)
我的代码问题是,当我向系统添加另一个玩家时,我可以自由移动他们,只能同时控制一个玩家时,但当我尝试同时移动两个玩家时,它们无法自由移动,我一次只能按下4个按钮。
尝试使用WASD和箭头键来操作方块,并看看我在说什么。
正如我所说,有一部分我不完全理解,可能是这个错误的原因所在?我在代码片段中标出了它。
我的问题是:为什么我不能同时自由移动两个玩家?
整个代码如下,并且我标记了我不理解的部分:
对于最佳体验,请使用全屏功能
{ function startGame() { myGameArea.start(); myStick = new component(100, 100, 200, 200, "red"); myStick2 = new component(100, 100, 600, 200, "green"); } var myGameArea = { canvas : document.createElement("canvas"), start : function() { var bodyID = document.getElementById("body"); this.canvas.width = bodyID.offsetWidth; this.canvas.height = (bodyID.offsetHeight); this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[2]); this.interval = setInterval(updateGameArea, (1000 / 60)); //我不理解的部分 window.addEventListener('keydown', function (e) { myGameArea.keys = (myGameArea.keys || []); myGameArea.keys[e.keyCode] = true; }); window.addEventListener('keyup', function (e) { myGameArea.keys[e.keyCode] = false; }); //结束 }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }; function component(width, height, x, y, color, mLeft, mRight, mUpLeft, mUpRigth){ this.width = width; this.height = height; this.x = x; this.y = y; this.speedX = 0; this.speedY = 0; this.update = function(){ ctx = myGameArea.context; ctx.fillStyle = color; ctx.fillRect(this.x, this.y, this.width, this.height); }; this.newPos = function(){ this.x += this.speedX; this.y += this.speedY; }; this.player1 = function(){ this.speedX = 0; this.speedY = 0; if (myGameArea.keys && myGameArea.keys[65]) {this.speedX = -2; } //向左 if (myGameArea.keys && myGameArea.keys[68]) {this.speedX = 2; } //向右 if (myGameArea.keys && myGameArea.keys[87]) {this.speedY = -2; } //向上 if (myGameArea.keys && myGameArea.keys[83]) {this.speedY = 2; } //向下 }; this.player2 = function(){ this.speedX = 0; this.speedY = 0; if (myGameArea.keys && myGameArea.keys[37]) {this.speedX = -2; } //向左 if (myGameArea.keys && myGameArea.keys[39]) {this.speedX = 2; } //向右 if (myGameArea.keys && myGameArea.keys[38]) {this.speedY = -2; } //向上 if (myGameArea.keys && myGameArea.keys[40]) {this.speedY = 2; } //向下 }; } function updateGameArea(){ myGameArea.clear(); myStick.player1(); myStick.newPos(); myStick2.player2(); myStick2.newPos(); myStick.update(); myStick2.update(); } }
.nm{ margin: 0; padding: 0; } canvas{ display: block; background-color: lightgray; }
Canvas stick game!
Canvas多人游戏,我无法按下超过4个按钮
问题原因:
- 当同时按下4个以上的键时(在1/60秒内),没有任何键被报告。
解决方法:
- 使用event.key
替代event.keyCode
来获取按键值。
- 使用requestAnimationFrame
代替setInterval
来控制动画帧率。
- 使用回调函数的时间参数来控制帧率。
代码解析:
- 代码中使用了两个方向键盘控制游戏角色的移动。
- 当按下键盘上对应的方向键时,会改变角色的速度。
- 通过requestAnimationFrame
来更新游戏画面,以实现流畅的动画效果。
注意事项:
- 使用event.key
可以解决部分问题,但它并不完全支持所有浏览器。
- 通过requestAnimationFrame
控制帧率可以提高游戏的性能和流畅度。
以上就是针对问题出现原因和解决方法的整理。
这个问题的出现原因是键盘的一个bug。由于某些非数字键盘的工作方式,某些键盘组合无法正常工作(例如,某些键会互相取消)。
解决方法之一是提供可自定义的游戏控制和程序快捷键等功能。这样做的另一个原因是,使用DVORAK键盘的人可能会觉得你优化为QWERTY键盘的游戏控制方式很繁琐。
另外,一些其他的信息:
- 提示:我无法复现你的问题,如果你在另一台电脑上尝试,很可能也无法复现。
- 可以查看以下文章获取更多信息:键盘是邪恶的。