检查JavaScript中2个div之间的冲突

时间:2018-02-25 20:24:31

标签: javascript jquery jquery-collision

当检测到与构成障碍物的div的上部碰撞时,我遇到了问题。

我可以检测到两侧和下边缘的碰撞,但不能检测上边缘的碰撞。

for (i = 0; i < game.obstacles.length; i++){
  // Colisiones con los bordes laterales
  if (marioX < obstacleX[i] + obstacleWidth[i] &&
    marioX + marioWidth > obstacleX[i] &&
    marioY < obstacleY[i] + obstacleHeight[i] &&
    marioY + marioHeight > obstacleY[i]) {
    game.player.collisionLateral();
  }
  // Colisiones con el borde inferior
  if (marioY < obstacleY[i] + obstacleHeight[i] &&
    marioY + marioHeight > obstacleY[i] &&
    marioX < obstacleX[i] + obstacleWidth[i] &&
    marioX + marioWidth > obstacleX[i]) {
    game.player.collisionDown();
  }
  // Colisiones con el borde superior
  if (marioY > obstacleY[i] + obstacleHeight[i] &&
    marioY + marioHeight < obstacleY[i] &&
    marioX < obstacleX[i] + obstacleWidth[i] &&
    marioX + marioWidth > obstacleX[i]) {
    //entonces
    game.player.collisionUp();
  }
}

我有这两个碰撞,但我不能让角色的上边缘留在那个div上

我在这里留下了github https://github.com/JesusSilva/super-mario

的链接

2 个答案:

答案 0 :(得分:0)

垂直碰撞检测的条件是互斥的。

private void RemoveControls(Type class)
{
    for (int i = TablePanel.Controls.Count - 1; i >= 0; i--)
    {
        if (TablePanel.Controls[i] is class)
            TablePanel.Controls[i].Dispose();
    }
}

marioY > obstacleY[i] + obstacleHeight[i] && marioY + marioHeight < obstacleY[i] marioHeight是正面的,对吗?让我们用0替换它们来删除这里的常量。然后我们得到marioY&gt;障碍物[i]&amp;&amp; marioY&lt;障碍Y [i]在同一时间永远不会成真。

你所有的碰撞测试代码都在检查div是否重叠,你只需要做一次。

要确定发生碰撞的边缘,您可能需要检查从马里奥中心到障碍物的x和y距离,并使用最短的距离来确定发生碰撞的位置,或者您可能需要任何东西在马里奥的顶部或底部范围内,即使靠近右边缘或左边缘,也要记录垂直碰撞。你可能有碰撞时马里奥和障碍物移动的矢量,你可以通过它们的差异来确定碰撞的矢量。

答案 1 :(得分:0)

好的,首先你的检测代码不起作用,如果你对不同的情况提出警告,你会看到最后一个&#34; if&#34;永远不会被称为,它永远是第二个。使用此代码,我得到了正确的行为:

for (i = 0; i < game.obstacles.length; i++){

  if (marioX < obstacleX[i] + obstacleWidth[i] &&
    marioX + marioWidth > obstacleX[i] &&
    marioY < obstacleY[i] + obstacleHeight[i] &&
    marioY + marioHeight > obstacleY[i]) {
    game.player.collisionLateral();
  }
  //Test when mario is below the obstacle
  else if (marioY < obstacleY[i] + obstacleHeight[i] &&
    marioY + marioHeight >= obstacleY[i] &&
    marioX < obstacleX[i] + obstacleWidth[i] &&
    marioX + marioWidth > obstacleX[i]) {
    game.player.collisionDown();
  }
  //Test when mario is above the obstacle
  else if (marioY + marioHeight > obstacleY[i] + obstacleHeight[i] &&
    marioY <= obstacleY[i] + obstacleHeight[i] &&
    marioX < obstacleX[i] + obstacleWidth[i] &&
    marioX + marioWidth > obstacleX[i]) {
    game.player.collisionUp();
  }
 }
}

但它并没有解决你的问题。当马里奥从上面击中障碍物时,他需要留在这个障碍物上,所以你称之为你的功能&#34; collisionUp&#34;这使得speedY为零。但是你在main.js中有这个功能:

  setInterval(function() {
    game.player.render();
    game.player.winner();
    checkCollisions();
  }, 1000 / fps);

此功能为Mario的Y位置执行此操作:

  var newY = this.posY + this.speedY - 5;
  if (newY >= 0 && newY <= this.size.height - 70) {
    this.posY = newY;
  }
  this.element.css({ bottom: this.posY, left: this.posX });

总是将Mario向下移动以模拟重力。所以你必须找到一个解决方案,当speedY为零时因为Mario碰到上面的障碍,渲染功能的这一部分被停用。

;)