移动速度像按键事件

Moving speed like keypress event

本文关键字:事件 速度 移动      更新时间:2023-09-26

我尽力解释我的问题。我有一款吃豆人游戏,我用键盘移动吃豆人,吃豆人在每个方向移动一个恒定的单位,我根据我之前定义的地图检查碰撞,"-"是障碍,现在我想创造敌人,我希望敌人随机移动,不需要按键,当然,问题是,通过按键控制速度。但随机移动,我不能保证敌人移动像它按下键盘,我想控制帧率在这里我使用requestAnimationFrame,我尝试帧控制,但没有工作,这是我的代码:

   function handleKeyPressed(e) {
   var PacMan = scene.getObjectByName('PacMan');
   gameSong.play();
   switch(String.fromCharCode(e.which))
   {
     case "w": if(!detectaColisao(PacMan.position.x, PacMan.position.y + SCALE))
          PacMan.position.y += SCALE;
       break;
     case "a": if(!detectaColisao(PacMan.position.x - SCALE, PacMan.position.y))
         PacMan.position.x -= SCALE;
       break;
     case "s": if(!detectaColisao(PacMan.position.x, PacMan.position.y - SCALE))
         PacMan.position.y -= SCALE;
       break;
     case "d": if(!detectaColisao(PacMan.position.x + SCALE, PacMan.position.y))
         PacMan.position.x += SCALE;
       break;
   }
}
    function anima()
{
  var delta=clock.getDelta();
  orbitCamera.update(delta);
  requestAnimationFrame(anima);
  rendere

移动位置。X像10,但每次都移动

你的意思是在动画被处理之前它移动了很多次吗?

这样做的原因是,从你的渲染循环中按下键是异步的——它发生在一个键被按下的时候,只要你有一个键被按下,它是恒定的。

你所要做的就是在每个animate()循环中只移动一次吃豆人。

所以我要改变的是——不要在你按下的函数中移动吃豆人,而是触发一些布尔值,然后在animate()循环中移动吃豆人,就像这样:

var u, d, l, r;
u = d = l = r = false;
function handleKeyPressed(e) {
  switch (String.fromCharCode(e.which)) {
    case "w":
      u = true;
      break;
    case "a":
      l = true;
      break;
    case "s":
      d = true;
      break;
    case "d":
      r = true;
      break;
  }
}
function handleKeyReleased(e) {
  switch (String.fromCharCode(e.which)) {
    case "w":
      u = false;
      break;
    case "a":
      l = false;
      break;
    case "s":
      d = false;
      break;
    case "d":
      r = false;
      break;
  }
}
function moveModel(_u, _d, _l, _r, obj) {
  if (_u && !detectaColisao(obj.position.x, obj.position.y + SCALE)) {
    obj.position.y += SCALE;
  }
  if (_d && !detectaColisao(obj.position.x, obj.position.y + SCALE)) {
    obj.position.y -= SCALE;
  }
  if (_l && !detectaColisao(obj.position.x, obj.position.y + SCALE)) {
    obj.position.x -= SCALE;
  }
  if (_r && !detectaColisao(obj.position.x, obj.position.y + SCALE)) {
    obj.position.x += SCALE;
  }
}
function anima() {
  var PacMan = scene.getObjectByName('PacMan');
  moveModel(u, d, l, r, PacMan);
  var delta = clock.getDelta();
  orbitCamera.update(delta);
  requestAnimationFrame(anima);
  rendere();
}

请注意,当键被释放时,您还需要再次关闭这些布尔值,因此我们添加了另一个handleKeyReleased来捕获这种情况。和handleKeyPressed函数相反

所以你需要添加这个抽象层的原因是按键事件发生的时候,它不关心你在动画周期的哪个位置。但是我们只想在每个动画循环中移动一次,所以我们不是直接移动它,而是创建一系列标志来告诉模型是否应该移动以及如何移动。

啊,好吧。也许你可以给它们的userData添加一个值,比如"ghost.userData"。计时器",然后每个周期加1。当它的冷却时间超过了你定义的某个变量,比如60秒,那么你就可以给它们一个随机移动,并将计时器设置回0。

这样他们就会按你规定的时间间隔采取步骤。