我想要实现什么?
我有一个精灵,它应该随着鼠标的位置移动(有点像光标)。在我的情况下,我也有一些其他纹理(障碍类)。因此,如果鼠标与这样的障碍物碰撞,我希望纹理停止向该方向移动。
有什么问题?
虽然纹理跟随鼠标并在鼠标与障碍物"碰撞"时停止,但在某些时候光标不再在边界矩形内,而是在墙壁的另一边。结果,纹理的位置被更新到鼠标的位置,它突然出现在墙的后面,这不是一个理想的行为。
我的碰撞方法
private void CheckCollision(List<Obstacle> _obstacleList, MouseState mState)
{
int xOffset = oldMouseState.X - mState.X;
int yOffset = oldMouseState.Y - mState.Y;
Vector2 offsetPosition = new Vector2(oldMouseState.X + xOffset,oldMouseState.Y + yOffset);
bool collides = false;
foreach (Obstacle obstacle in _obstacleList)
{
if (obstacle.BoundRectangle.Contains(offsetPosition))
{
collides = true;
}
}
if (!collides)
{
position = offsetPosition;
}
}
在我的例子中,如何防止精灵穿过墙壁?
如您所知,可以通过调用Mouse.GetState()
来读取鼠标位置。但是你也可以通过Mouse.SetPosition(X,Y)
将鼠标的位置设置为你想要的任何位置,然后鼠标就会到达那里。
所以,如果你面对着,比如说,一个X屏障(垂直屏障),只需调用
Mouse.SetPosition(oldMouseState.X, mState.Y);
,你的鼠标不会改变它的X值,即使你把鼠标往那个方向推,它也不会穿过墙壁,但它可以上下移动。如果你从墙边退下,只要不打这条线,它就会像以前一样运行。
您可以存储鼠标的最后(有效)已知位置和鼠标的当前位置(有效意味着鼠标不在它不应该在的矩形中)。当你在当前鼠标位置碰到一个鼠标不应该经过的矩形时,你可以在while循环中迭代回到最后一个有效位置,并在每次将鼠标移近有效位置时检查鼠标是否仍处于阻塞精灵中。如果鼠标在禁区之外,你只需退出while循环,鼠标就非常接近障碍物的边界。