像按键事件一样移动速度

时间:2016-07-01 09:03:37

标签: javascript three.js

我尽力解释我的问题。 我有一个pacman游戏,我用键盘移动pacman,pacman在每个方向移动一个恒定的单位我根据我之前定义的地图检查colision,其中“ - ”是障碍物,现在我想创建敌人我希望那些敌人在没有按键的情况下随机移动,事情就是用按键控制速度控制,但是随机移动我不能保证敌人移动就像按键盘一样我要控制这里的帧速率我正在使用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

2 个答案:

答案 0 :(得分:0)

  

它在position.x中移动,如10,但每次移动

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

这样做的原因是keypressed与你的渲染循环异步 - 只要按下一个键就会发生这种情况,只要按下一个键就会保持不变。

你要做的就是每个动画()循环只移动你的pacman一次。

所以我要改变的是 - 不要在你的按键功能中移动pacman,而是触发一些布尔值,然后在animate()循环内移动你的pacman,如下所示:

{{1}}

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

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

答案 1 :(得分:0)

啊,没关系,这是有道理的。所以也许你可以为他们的userData添加一个值,一些变量如“ghost.userData.timer”然后每个你添加1的循环。当它超过你定义的一些coolDown变量时,比如60,那么你给它们一个随机的移动并将定时器设置回0。

这样他们就会按照你定义的定期间隔采取措施。