2013-02-27 93 views
1

我目前正在XNA中撰寫平臺遊戲。 我的碰撞測試是通過運行一個foreach循環來測試玩家的邊界框與每個瓦片的邊界框。但是,我無法弄清楚如何測試玩家是不是觸摸任何塊。在XNA中測試所有非碰撞瓷磚

我該如何運行我的陣列並測試他們的球員是否沒有觸及任何阻擋,以便我可以檢查他是否處於半空中?任何幫助或建議將不勝感激。先謝謝你!

/////////////////////////////////////

我碰撞的代碼是

if (personRectangle.TouchTopOf(newRectangle)) 
    { 
     onGround = true; 
     test = false; 
     test2 = true; 
    } 

相應的布爾測試是

public static bool TouchTopOf(this Rectangle r1, Rectangle r2) 
    { 
     return (r1.Bottom >= r2.Top - 1 && 
       r1.Bottom <= r2.Top + (r2.Height/2) && 
       r1.Right >= r2.Left + (r2.Width/5) && 
       r1.Left <= r2.Right - (r2.Width/5)); 
    } 

這一塊代碼測試碰撞在Game1.cs更新。

 foreach (CollisionTiles tile in map.CollisionTiles) 
      player.Collision(tile.Rectangle); 

這是在我的地圖類瓷磚的列表

private List<CollisionTiles> collisionTiles = new List<CollisionTiles>(); 

回答

3

XNA矩形有一個內置的相交方法:

if (rect1.Intersects(rect2)){ 
... 
} 

通過瓷磚的矩形,只是循環調用相交在每一個。爲了使效率更高,您應該將玩家座標映射到世界座標上,並確定距離玩家最近的座標,這樣做可以縮小需要循環的座標點的數量。

編輯:澄清,你可以有:

bool collision=false; 
foreach (CollisionTiles tile in map.CollisionTiles) { 
    if(personRectangle.Intersects(tile.Rectangle)) { 
     collision =true; 
     break; 
    } 
} 

那麼,如果碰撞是真實的,你知道有一個碰撞的地方。

+0

我不確定我是否明白你的意思。我目前正在使用rectangle.Top等方法來測試邊界。但是它會對每個塊進行測試,並且會因爲觸及某些塊而不是其他塊而導致混淆,導致觸發真(true)和其他(false)。我正在測試它是否觸及任何塊... – Brecon 2013-02-27 19:59:46

+0

@Brecon請參閱我的編輯 – 2013-02-28 08:46:09

0

除非你有一個不要的原因,否則保持簡單。只要跟蹤你碰撞了多少東西。如果你的計數結果爲0,那麼你沒有碰到任何東西。

無需擔心修改/優化任何你的代碼,它可能是這樣的:

int touchedCount = 0; 
foreach (CollisionTiles tile in map.CollisionTiles) 
{ 
     if (player.Collision(tile.Rectangle)) 
     { 
      touchedCount++; 
     } 
} 

if (touchedCount == 0) 
{ 
    //You did not collide with anything 
} 

然後你的碰撞方法內做同樣的,讓您檢查跟蹤的東西,如果發生碰撞,所有。這可能是最簡單的使用Rectangle.Intersects作爲其他答案的建議。

+0

如果您不碰撞touchCount,則代碼不正確。你可能會把增量放在裏面但是其他方面的碰撞不會被檢測到 – 2013-02-27 19:16:55

+0

哈。即使有這種想法我的代碼是錯誤的。我明白你的意思了。我相信我的編輯仍然解決了這個問題。再次感謝! – SpartanDonut 2013-02-27 19:33:37