You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS游戏开发:如何实现两个对象同时移动?

解决双坦克同时移动的问题

你的问题根源在于keypress事件是单次触发的——每次只能响应一个按键操作,所以同时按住两个键时,只有最后触发的那个按键会生效,另一个坦克自然就停了。用keydown和keyup事件记录按键状态,再配合动画循环就能实现多键同时控制。

具体实现步骤:

  • 用一个对象保存当前按下的按键状态
  • 按下按键时标记为true,松开时标记为false
  • 在动画循环里根据按键状态持续更新坦克位置,而不是在事件回调里单次修改

替换你原来的代码,改成这样:

// 保存按键状态的对象
const keys = {};

// 监听按键按下事件
document.addEventListener('keydown', (e) => {
  keys[e.keyCode] = true;
});

// 监听按键松开事件
document.addEventListener('keyup', (e) => {
  keys[e.keyCode] = false;
});

// 动画循环,用requestAnimationFrame实现平滑更新
function animate() {
  // 根据按键状态更新坦克1位置
  if (keys[97]) { // A键
    tank.x -= 10;
  }
  if (keys[100]) { // D键
    tank.x += 10;
  }

  // 根据按键状态更新坦克2位置
  if (keys[52]) { // 4键
    tank2.x -= 10;
  }
  if (keys[54]) { // 6键
    tank2.x += 10;
  }

  f_draw();
  requestAnimationFrame(animate);
}

// 启动动画循环
animate();

这样修改后,你可以同时按住A/D和4/6键,两个坦克就能同时移动了。另外注意:keyCode已经被标记为废弃,如果你想兼容新浏览器,可以换成e.key(比如判断e.key === 'a'、e.key === '4'),不过用keyCode在游戏场景里暂时还是能用的。

内容的提问来源于stack exchange,提问作者koarlkoarl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:30:52