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

时间:2014-01-28 13:50:45

标签: javascript jquery html5 canvas

这是我的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) ;    
    }
}

2 个答案:

答案 0 :(得分:2)

也许这里有一些事情可以开始:http://jsfiddle.net/d247V/3/

我更新了跳转,默认跳转为80(高到足以进入下一个平台),然后在keydown.up上我用当前ball.y位置+默认跳转

我认为虽然问题在于你是如何跟踪球在空中的,但是当发现碰撞时,球在技术上已不再在空中,但你没有任何说法,所以下面的代码基本上剪断了@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找到它们。

答案 1 :(得分:0)

看起来您的碰撞检测效果非常好。 它的游戏循环有一些问题。 你不应该对按键进行碰撞检测,因为这只会触发一次。当球在空中时,你需要一直检查碰撞。 像这样:

   ... } 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;
          }
        }
      }

使用他的代码,你可以跳上第一个平台。 (另请注意,我改变了ball.y定位)。

但仍存在一些问题:

  • 球不能离开平台,因为只要他在空中与他正躺着的平台发生碰撞。
  • 如果你将球向左或向右移动到平台边界上,如果他再次开始摔倒,而不是在空中盘旋,那将会更有趣。 (相信我,我玩了一些游戏)。

也许你应该延迟碰撞检测,直到球获得一些高度来逃避碰撞检测。 我更新你的小提琴并将其转换为plunker(使用firebug你可以在这里更好地调试功能)Play with me!

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