Javascript 跳转算法isn';当到达一个街区时,它不工作

Javascript 跳转算法isn';当到达一个街区时,它不工作,javascript,jquery,html,canvas,Javascript,Jquery,Html,Canvas,这是我的JSFIDLE: 正如您在我的JSFIDLE中所看到的,当球到达一个块时,跳转函数不起作用。我知道我的算法中缺少了一些使球跳转的东西,但我无法理解,我希望您能提供一些帮助 if (InAir) { if (InAir == 1) { if (ball.y > jumpMaxHeight) { ball.y -= gravity; } else { InAir = 2; }

这是我的JSFIDLE:

正如您在我的JSFIDLE中所看到的,当球到达一个块时,跳转函数不起作用。我知道我的算法中缺少了一些使球跳转的东西,但我无法理解,我希望您能提供一些帮助

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) ;    
    }
}
if(InAir){
如果(InAir==1){
如果(ball.y>jumpMaxHeight){
ball.y-=重力;
}否则{
InAir=2;
}
}
如果(InAir==2){
如果(球y<390){
ball.y+=重力;
}否则{
球y=390;
InAir=false;
ball.color=“黑色”;
}
}
}else if(keydown.up&&!InAir){
InAir=1;
ball.color=“#4285F4”;
}
对于(var j=0;j
您的碰撞检测似乎工作得很好。 它的gameloop有一些问题。 您不应该在向上按键时执行碰撞检测,因为这只会触发一次。当球在空中时,你需要随时检查是否有碰撞。 像这样:

…}else if(keydown.up&&!InAir){
InAir=1;
ball.color=“#4285F4”;
}
如果(在空中){
对于(var j=0;j
用他的代码你可以跳到第一个平台上。(还要注意,我更改了ball.y的位置)

但仍存在一些问题:

  • 球不能离开平台,因为他一悬空,与平台的碰撞就开始了
  • 如果你将球向左或向右移动到平台边界上,如果他再次开始摔倒,而不是在空中盘旋,那会更有趣。(相信我,我玩过一些游戏)
也许你应该推迟碰撞检测,直到球达到一定的高度,以逃避碰撞检测。 我更新了你的提琴并将其转换为plunker(使用firebug,你在这里有更好的调试功能)


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

也许可以从以下几点开始:

我更新了跳跃的默认值为80(足够高,可以到达下一个平台),然后在keydown.up上,我用当前的球更新它。y位置+默认值

我认为问题在于你如何追踪球是否在空中,当检测到碰撞时,球从技术上讲不再在空中,但你没有任何这样的说法,请参见下面截取的代码@mainguy基本上是怎么说的,但稍作修改,不继续重新分配球。y,在小提琴中,它工作得相当好:

      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;
                  }
              }
          }
      }
if(InAir)
{
对于(var j=0;j

我的小提琴打破了代码的重力部分,因为你现在还需要知道圆的x是否通过了矩形的x屏障,如果没有,就下降。所以这并不是一个完整的解决方案,但是如果你从障碍物上向右或向左跳跃,重力过程就像预期的一样,只要不存在碰撞,你就会跌到底部。还有一些细微的调整,但我想你可以通过我添加的零件旁边的注释找到它们。

伙计,这是一个在空中盘旋的虫子,它应该会再次掉到地上吗?不,不是虫子,是球!你在自己的日常生活中称之为球。一个虫子通常有六条腿,而且很有可能会飞到空中:-)我的意思是一个游戏错误,球不应该浮在空中,而是应该掉到地上,当它在区块边界之外时:)谢谢你更新小提琴。你很有帮助,尽管经过一些深入的研究,我改变了我所有的算法,这是我的新版本游戏:正如你所看到的,地心引力工作得很好,当它在一个街区上并离开时,它不会漂浮在空中,现在我期待着建立一些关卡谢谢:太棒了!很高兴我能帮忙。我喜欢摆弄它。
      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;
                  }
              }
          }
      }