当检测到与构成障碍物的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
的链接答案 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碰到上面的障碍,渲染功能的这一部分被停用。
;)