2015-08-28 53 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循環,並且鼠標非常接近障礙物的邊界。