我想要实现的目标是什么?
我有一个Sprite,它应该随着鼠标位置移动(有点像光标)。在我的情况下,虽然我也有一些其他纹理(障碍类)。因此,如果鼠标碰撞这样一个障碍物,我希望纹理停止向那个方向移动。
有什么问题?
虽然纹理确实跟随鼠标,但在鼠标碰撞时也会停止。有障碍物,在某些时候光标不再在边界矩形内,而是在墙的另一侧。结果,纹理的位置更新到鼠标位置,它突然出现在墙后面,这不是一个理想的行为。
我的碰撞方法。
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;
}
}
问题
在我的情况下,有什么方法可以阻止雪碧穿过墙壁?
提前致谢。
答案 0 :(得分:1)
如您所知,您可以通过调用Mouse.GetState()
来阅读鼠标位置。但您也可以通过Mouse.SetPosition(X,Y)
将鼠标位置设置为您想要的任何位置,鼠标将移动到那里。
所以,如果你反对,比如X屏障(垂直屏障),只需打电话
Mouse.SetPosition(oldMouseState.X, mState.Y);
即使将鼠标朝那个方向推动,你的鼠标也不会改变它的X值,它根本不会穿过墙壁,但它可以上下移动。 如果你从墙上退下来,就不要打电话给这条线,它就会像以前那样运作。
答案 1 :(得分:1)
您可以存储鼠标的最后(有效)已知位置和鼠标的当前位置(有效意味着鼠标不在不应该的矩形中)。当您点击鼠标不能通过当前鼠标位置通过的矩形时,您将迭代回到while循环中的最后一个有效位置,并在每次移动鼠标时检查鼠标是否仍在阻塞精灵中更接近有效位置。如果鼠标位于禁区之外,则只需退出while循环,鼠标就会非常靠近障碍物的边界。