【发布时间】:2011-06-10 06:59:47
【问题描述】:
我遇到了这个问题,每当我触地时,我的速度都会设置为 0。这是因为我的功能将我推出,将我精确地推到边缘。所以当我然后除以块的高度时,它仍然认为我在那个块上。当我跳到最右边的墙上时也会发生这种情况。
示例: 在坐标 0,720 和我的 y = 723 上有一个块
723 / 5 = 144(四舍五入)
然后我被推到 720。但是当我除以块高度时,它仍然认为我正在触摸 720 上的块,直到让我们说 725
720 / 5 = 144
我该如何解决这个问题,我的意思是我知道问题出在哪里,但我看不到任何解决方法。
此外,当我不跳跃并且恰好在关卡的右边缘时,我可以向右走来穿过墙壁,但一旦我跳跃,碰撞检测就会跳入。
我不知道最后一个问题发生的原因和方式,任何人都可以看看会发生什么。
代码:
void DoCollisions()
{
onGround = false;
Position.Y += Velocity.Y;
Vector2 tileCollision = GetTileCollision();
if (tileCollision.X != -1 || tileCollision.Y != -1)
{
onGround = true;
Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
new Rectangle(
tileCollision.X * World.tileEngine.TileWidth,
tileCollision.Y * World.tileEngine.TileHeight,
World.tileEngine.TileWidth,
World.tileEngine.TileHeight
)
);
Velocity.Y = 0;
Position.Y += collisionDepth.Y;
}
Position.X += Velocity.X;
tileCollision = GetTileCollision();
if (tileCollision.X != -1 || tileCollision.Y != -1)
{
Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
new Rectangle(
tileCollision.X * World.tileEngine.TileWidth,
tileCollision.Y * World.tileEngine.TileHeight,
World.tileEngine.TileWidth,
World.tileEngine.TileHeight
)
);
Velocity.X = 0;
Position.X += collisionDepth.X;
}
}
Vector2 GetTileCollision()
{
int topLeftTileX = (int)(CollisionRectangle.TopLeft.X / World.tileEngine.TileWidth);
int topLeftTileY = (int)(CollisionRectangle.TopLeft.Y / World.tileEngine.TileHeight);
int BottomRightTileX = (int)(CollisionRectangle.DownRight.X / World.tileEngine.TileWidth);
int BottomRightTileY = (int)(CollisionRectangle.DownRight.Y / World.tileEngine.TileHeight);
for (int i = topLeftTileX; i <= BottomRightTileX; i++)
{
for (int j = topLeftTileY; j <= BottomRightTileY; j++)
{
if (World.tileEngine.TileIsSolid(i, j))
{
return new Vector2(i,j);
}
}
}
return new Vector2(-1,-1);
}
【问题讨论】:
-
您可以使用en.wikipedia.org/wiki/Box2D 进行碰撞。它是免费的,并且有一个 C# 端口。
标签: c# debugging collision-detection