碰撞检测弹跳问题c#
问题描述:
因此,我得到了我的碰撞检测工作,但由于某种原因,玩家似乎将介绍地面1帧,然后在下一帧跳出来,然后按其预期跌落。碰撞检测弹跳问题c#
代码我使用的碰撞检测
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
)
);
Position.Y -= Velocity.Y;
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
)
);
Position.X -= Velocity.X;
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);
}
答
只需使用Y
方向为例,乍一看似乎你正在调整Y
两次,在碰撞前检查一次,然后当你得到一个碰撞你恢复了Y
和collisionDepth
你可能不应该被恢复的Y
,如果collisionDepth.Y表明您相交的地面,你应该只由推你的对象回推的对象了深度的数量,这会让你在地面上冲洗。
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;
// Depending on your coordinate system this should
// be either + or - collisionDepth.Y
Position.Y += collisionDepth.Y;
}