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){…
    读取状态,这更容易记住