2015-08-28 55 views
0

我想实现什么?如何防止“鼠标对象”移动throgh矩形?

我有一个应该随鼠标位置移动的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

我认为你需要检查鼠标位置对每个障碍物如:(offsetPosition.X user3256944

回答

1

如您所知,您可以通过致电Mouse.GetState()来阅读鼠标位置。但是,您也可以通过Mouse.SetPosition(X,Y)将鼠标位置设置为任何您想要的值,并且鼠标将移动到那里。

所以,如果你面对,比方说,一个X屏障(垂直障碍),只需拨打

Mouse.SetPosition(oldMouseState.X, mState.Y); 

即使推你的鼠标在这个方向你的鼠标不会改变它的X值,它根本不会穿墙,但它可以上下移动。 如果你从墙上退下来,只是不要叫这条线,它会像befor一样运作。

+0

我确实使用了Mouse.SetPosition,它确实有效。当我以一定的速度(非常快)移动鼠标时,它似乎忽略了实现,并且陷入可疑的矩形。 –

1

您可以存储鼠标的最后(有效)已知位置和鼠标的当前位置(有效表示鼠标不在不应存在的矩形中)。当你点击一个鼠标不应该通过当前鼠标位置的矩形时,可以在while循环中迭代回最后一个有效位置,并且每次移动鼠标时检查鼠标是否仍在阻塞精灵中有效的位置。如果鼠标在禁区之外,您只需退出while循环,并且鼠标非常接近障碍物的边界。