Javascript 如何在画布游戏中更好地处理玩家的移动?
我有一个侧面滚动的太空船游戏,我一直试图找到一种有效处理玩家移动的方法。这是我迄今为止从以下来源复制的代码:Javascript 如何在画布游戏中更好地处理玩家的移动?,javascript,canvas,Javascript,Canvas,我有一个侧面滚动的太空船游戏,我一直试图找到一种有效处理玩家移动的方法。这是我迄今为止从以下来源复制的代码: window.addEventListener("keydown", keyDown); window.addEventListener("keyup", keyUp); setInterval(move, 33.3); keys = {}; function keyDown(event){ keys[event.keyCode] = true; } function k
window.addEventListener("keydown", keyDown);
window.addEventListener("keyup", keyUp);
setInterval(move, 33.3);
keys = {};
function keyDown(event){
keys[event.keyCode] = true;
}
function keyUp(event){
delete keys[event.keyCode];
}
function move(){
if (65 in keys && player.x > 0)
player.x -=5;
if (68 in keys && player.x < 576)
player.x +=5;
if (87 in keys && player.y > 0)
player.y -= 5;
if (83 in keys && player.y < 576)
player.y += 5;
}
window.addEventListener(“keydown”,keydown);
window.addEventListener(“keyup”,keyup);
设定间隔(移动,33.3);
键={};
功能键控(事件){
keys[event.keyCode]=true;
}
功能键控(事件){
删除键[event.keyCode];
}
函数move(){
如果(65英寸键和&player.x>0)
player.x-=5;
如果(68个键和&player.x<576)
player.x+=5;
如果(87个键和&player.y>0)
player.y-=5;
if(83英寸键和&player.y<576)
player.y+=5;
}
问题:
键[event.keyCode]
设置为true?这句话是怎么说的是否删除键[event.keyCode]
只删除键对象中包含该键代码的任何属性李>
键[event.keyCode]
设置为true?这句话是怎么说的
从技术上讲,你不会。您只需要在键[event.keyCode]
处添加一些值。这样做的目的是向keys
对象添加一个与密钥代码匹配的密钥。这允许您稍后检查并查看播放机是否按下了该按钮。您还可以将该值添加到数组或类似的内容中。这只是提供了一个简单的方法来查找,如果一个给定的键已按下
是否删除键[event.keyCode]
只删除键对象中包含该键代码的任何属性
它从keys
对象中删除event.keyCode
属性。例如,假设玩家之前按下了“A”或键代码65<代码>删除键[event.keyCode]相当于删除键[65]
。现在,keys
对象不再具有65
属性,当您在move
中检查它时,它将不会返回true
实施玩家移动的更好方法是什么
你所做的是完全合理的,并在许多游戏中使用。事实上,这是我使用的技巧,当我
为什么需要将键[event.keyCode]
设置为true?这句话是怎么说的
从技术上讲,你不会。您只需要在键[event.keyCode]
处添加一些值。这样做的目的是向keys
对象添加一个与密钥代码匹配的密钥。这允许您稍后检查并查看播放机是否按下了该按钮。您还可以将该值添加到数组或类似的内容中。这只是提供了一个简单的方法来查找,如果一个给定的键已按下
是否删除键[event.keyCode]
只删除键对象中包含该键代码的任何属性
它从keys
对象中删除event.keyCode
属性。例如,假设玩家之前按下了“A”或键代码65<代码>删除键[event.keyCode]相当于删除键[65]
。现在,keys
对象不再具有65
属性,当您在move
中检查它时,它将不会返回true
实施玩家移动的更好方法是什么
你所做的是完全合理的,并在许多游戏中使用。事实上,这是我在时使用的技术,所以可以肯定的是,keys对象总是只有一个属性,并且(比如65)keycode对吗?@PixelProgrammer不一定。例如,如果用户同时按下两个键,则
键
将具有两个属性;每把钥匙一把。这也是为什么这是一个好的解决方案的另一个原因。它允许您轻松地一次处理多个按钮按下。当然,但它只有一个带有该键代码的属性。所以一个财产有65个,一个有68个。我问这个问题的原因是,如果我要使用数组,这意味着数组可能包含多个键码,我想确保对象不是这样。keyCode
和charCode
都是键盘事件对象的折旧属性,应该避免使用它们。请参阅使用keyboardEvent.code
和设置keys={}
而不是数组。然后在处理程序中设置keys[event.code]=event.type==“keydown”代码>然后可以使用if(key.ArrowUp)读取状态{…
这更容易记住,并且使代码更可读。事件。code
是键名,例如KeyW
和event。key
是预期的键,例如W
或W
,具体取决于班次。@Blindman67哦,哇,我甚至不知道事件。code
。太棒了。谢谢你。所以呢可以肯定的是,keys对象始终只有一个属性(比如65)keycode对吗?@PixelProgrammer不一定。例如,如果用户一次按下两个键,那么键
将有两个属性;每个键一个。这就是为什么这是一个好的解决方案的另一个原因。它允许您轻松地一次处理多个按钮按下。当然,但是它只有一个属性与该键代码一起。所以一个属性为65,一个属性为68。我问这个问题的原因是,如果我使用数组,这意味着数组可能包含多个键码,我想确保对象不是这样。keyCode
和charCode
都是键盘事件对象的折旧属性,应该避免使用em.请参阅使用keyboardEvent.code
并设置keys={}
而不是数组。然后在处理程序中使用keys[event.code]=event.type===“keydown”
设置,然后您可以使用if(keys.ArrowUp){…
读取状态,这更容易记住