当我认为它们应该相交时,两个矩形没有相交
Two rectangles are not intersecting when I think they should
我有一个敌人矩形
public void Update(GameTime gameTime)
{
enemyRectangle = new Rectangle((int)enemyPosition.X, (int)enemyPosition.Y, enemyTexture.Width, enemyTexture.Height);
...
我有一个 foreach
循环,遍历一个矩形列表和一个检查这两个矩形是否相交的方法,这将 return 一个布尔值。
foreach (Bounds bounds in bounds.boundsList)
{
if (bounds.EnemyWallIntersects(testEnemy.enemyRectangle, bounds.CurrentRectangle))
{
testEnemy.isEnemyCurrentlyColliding = true;
}
testEnemy.isEnemyCurrentlyColliding = false;
}
我确定这些矩形应该相交,但我不知道现在发生了什么。
我使用了一个断点,该矩形应该与到达它与敌人矩形具有相同 X 和 Y 的点相交。
这是"EnemyWallIntersects"方法。
public bool EnemyWallIntersects(Rectangle rect1, Rectangle rect2)
{
if (rect1.Intersects(rect2))
{
return true;
}
else
return false;
}
你的 testEnemy.isEnemyCurrentlyColliding = false;
在设置 testEnemy.isEnemyCurrentlyColliding = true;
之后立即发生,没有 else 语句,所以它总是被设置为 false。
我会记住这是一个 foreach 循环,因此即使您放置了 else 语句,列表中的下一项也会再次覆盖 testEnemy.isEnemyCurrentlyColliding
。如果您只需要检查其中一个结果是否为真,我建议使用 break
,这将结束当前的 foreach 循环。
举个例子:
foreach (Bounds bounds in bounds.boundsList)
{
if (bounds.EnemyWallIntersects(testEnemy.enemyRectangle, bounds.CurrentRectangle))
{
testEnemy.isEnemyCurrentlyColliding = true;
break;
}
testEnemy.isEnemyCurrentlyColliding = false;
}
如果您使用 break
,则不需要 else
语句,因为这会在原处结束 foreach 循环。
我有一个敌人矩形
public void Update(GameTime gameTime)
{
enemyRectangle = new Rectangle((int)enemyPosition.X, (int)enemyPosition.Y, enemyTexture.Width, enemyTexture.Height);
...
我有一个 foreach
循环,遍历一个矩形列表和一个检查这两个矩形是否相交的方法,这将 return 一个布尔值。
foreach (Bounds bounds in bounds.boundsList)
{
if (bounds.EnemyWallIntersects(testEnemy.enemyRectangle, bounds.CurrentRectangle))
{
testEnemy.isEnemyCurrentlyColliding = true;
}
testEnemy.isEnemyCurrentlyColliding = false;
}
我确定这些矩形应该相交,但我不知道现在发生了什么。 我使用了一个断点,该矩形应该与到达它与敌人矩形具有相同 X 和 Y 的点相交。
这是"EnemyWallIntersects"方法。
public bool EnemyWallIntersects(Rectangle rect1, Rectangle rect2)
{
if (rect1.Intersects(rect2))
{
return true;
}
else
return false;
}
你的 testEnemy.isEnemyCurrentlyColliding = false;
在设置 testEnemy.isEnemyCurrentlyColliding = true;
之后立即发生,没有 else 语句,所以它总是被设置为 false。
我会记住这是一个 foreach 循环,因此即使您放置了 else 语句,列表中的下一项也会再次覆盖 testEnemy.isEnemyCurrentlyColliding
。如果您只需要检查其中一个结果是否为真,我建议使用 break
,这将结束当前的 foreach 循环。
举个例子:
foreach (Bounds bounds in bounds.boundsList)
{
if (bounds.EnemyWallIntersects(testEnemy.enemyRectangle, bounds.CurrentRectangle))
{
testEnemy.isEnemyCurrentlyColliding = true;
break;
}
testEnemy.isEnemyCurrentlyColliding = false;
}
如果您使用 break
,则不需要 else
语句,因为这会在原处结束 foreach 循环。