到达块时跳跃算法不起作用



这是我的jsfiddle:http://jsfiddle.net/seekpunk/whz44/17/

当球到达一个块时,您可以在我的JSfiddle中看到跳跃功能无法正常工作。我知道我缺少我用来使球跳跃的算法中的某些东西,但我无法弄清楚我感谢您的帮助

if (InAir) {
    if (InAir == 1) {
        if (ball.y > jumpMaxHeight) {
            ball.y -= gravity;
        } else {
            InAir = 2;
        }
    }
    if (InAir == 2) {
        if (ball.y < 390) {
            ball.y += gravity;
        } else {
            ball.y = 390;
            InAir = false;
            ball.color = "black";
        }
    }
} else if (keydown.up && !InAir) {
    InAir = 1;
    ball.color = "#4285F4";
}
for (var j = 0; j < Blocks.collection.length; j++) {
    if (Collision(ball, Blocks.collection[j])) {
        //console.log("collision");
        ball.y = (Blocks.collection[j].blockY - ball.radius) ;    
    }
}

也许这是:http://jsfiddle.net/d247v/3/

我更新了跳跃以使默认跳跃为80(足够高到达下一个平台),然后在keydown上。

我认为问题是您如何跟踪球在空中是否在空中,当检测到碰撞时,从技术上讲,球不再在空中,但是您没有这样说的话,请参见在基本上剪切的代码基本上是@mainguy说的,但经过稍作修改,以免重新分配球。

      if( InAir )
      {
          for (var j = 0; j < Blocks.collection.length; j++) {
              if (Collision(ball, Blocks.collection[j])) {
                //console.log("collision");
                var calc = (Blocks.collection[j].blockY - ball.radius);
                  if( ball.y != calc ) {
                    ball.y = calc;
                    ball.color = "black";
                    InAir = 0;
                  }
              }
          }
      }

我的小提琴虽然打破了代码的重力部分,因为您现在还需要知道圆的X是否通过了矩形的X屏障,如果没有,则掉落。因此,这绝不是一个完整的解决方案,但是如果您从障碍物中跳跃并向右或向左走,则重力过程只要不存在碰撞,就可以按预期工作,您将掉落到底部。还有其他一些调整,但我认为您可以通过我添加的零件旁边的评论//Tweaked找到它们。

似乎您的碰撞检测工作得很好。它的Gameloop有一些问题。您不应该在键盘上进行碰撞检测,因为这只会发射一次。当球在空中时,您需要一直检查是否有碰撞。喜欢:

   ... } else if (keydown.up && !InAir) {
        InAir = 1;
        ball.color = "#4285F4";
      }
      if (InAir){
          for (var j = 0; j < Blocks.collection.length; j++) {
          if (Collision(ball, Blocks.collection[j])) {
            //console.log("collision");
            ball.y = (Blocks.collection[j].blockY - ball.radius) ;
            InAir=false;
          }
        }
      }

使用他的代码,您可以跳上第一个插图。(还请注意我更改了球。

但仍然存在一些问题:

  • 球不能离开脚下,因为一旦他空降了,他就会与他躺在踢进来的脚下碰撞。
  • 如果您将球向左或向右移动到板岩边框上,如果他再次开始掉下来,而不是悬停在空中,那将会更加有趣。(相信我,我玩了一些游戏)。

也许您应该延迟碰撞检测,直到球获得一定的高度以逃避碰撞检测。我更新您的小提琴并将其转换为Plunker(使用Firebug,您在这里可以更好地调试功能)与我一起玩!

不是一个完美的答案,但我希望这对您有帮助。

最新更新