2013-02-15 72 views
1

我瞭解Xna中每像素碰撞背後的理論,您可以從兩個紋理獲取紋理數據,然後比較它們,檢查例如字符紋理的alpha值。每像素碰撞 - 可以使用一些常用技巧

我想要做的是使用Per Pixel Collision來檢查Player Sprite是否通過檢查與某種顏色(黑色)的碰撞來觸摸地圖。我已經嘗試過實現這一點,但字符總是落在地圖上,沒有拋出任何編程錯誤。 請指點我的文章/教程/視頻,或者如果有人在這裏可以給我一些技巧和觀點,這將是偉大的。

+0

我意識到這有些偏離主題,但如果你正在開發一款新遊戲,你應該知道XNA是「死」的:http://www.wpcentral.com/xna-dead-long-live-xna。在您嘗試創建新內容之前,您可能需要查看MonoGame:http://monogame.codeplex.com/ – hross 2013-02-15 12:56:38

+2

您想顯示一些碰撞代碼嗎? – 2013-02-15 12:58:38

+0

我用Google搜索了一下,但大部分文章都很古老,看起來真的很長時間。我也很傷心地意識到Xna已經死了(但是我仍然覺得它是一個令人愉快的平臺,我目前沒有任何代碼可以顯示,我希望首先得到一些通用的指導,甚至可以預先得到一些僞代碼,因爲經過很多次嘗試我的代碼從未工作。 – 2013-02-15 13:44:36

回答

0

我不會檢查兩個紋理之間的像素到像素,如果我是你。雖然只檢查一點與地圖也不算太壞,

//In Class-scope: 
Color[] CollisionMapData; 
Texture2D CollisionMap; 

public void LoadContent() 
{ 
    CollisionMap = Content.Load<Texture2D>("map"); 
    CollisionMapData = new Color[CollisionMap.Width * CollisionMap.Height]; 
    CollisionMap.GetData<Color>(CollisionMapData); 
} 

public Boolean Collision(Vector2 position) 
{ 
    int index = (int)position.Y * CollisionMap.Width + (int)position.X; 

    if (index < 0 || index >= CollisionMapData.Length) //Out of bounds 
     return true; 

    if (CollisionMapData[index] == Color.Black) 
     return true; 

    return false; 
} 

對證地圖整個玩家精靈,你就必須要求在玩家精靈的每個像素碰撞方法,創造了vector2得到正確的點。 檢查可能有幾點比較容易(例如:頂部,頂部中間,頂部,左側,右側,底部左側,底部中間,底部。因爲邊已經被測試,所以不需要檢查中間。)