本教程詳細講解了畫素碰撞檢測的實現。
注意
這個教程的**是在前乙個教程:
2d碰撞教程
1:矩形檢測中實現的,在進行下面的教程前請確保已經完成教程
1的學習。
在前乙個例子當中,你已經通過舉行碰撞檢測實現了乙個躲避下落物體遊戲。而矩形只是通過你載入的紋理貼圖的大小來決定的,並不能準確的代表你的遊戲角色的大小,因此在遊戲當中你會發現出現一些誤差。
例如,在這種情況下遊戲角色並沒有碰到下落的物體,但是背景卻指示為遊戲角色已經被下落的物體擊中。這是由於在這種情況下兩個紋理貼圖出現了重合,而矩形的檢測就認為兩者已經產生了碰撞。
我們期望的情況應該如下圖,在沒有被下落物體擊中,即便是紋理貼圖相互重合也認為遊戲角色沒有被集中。
為了達到上述的目標,我們的**必須能夠做到只有在物體畫素產生碰撞之後再響應碰撞,這個就叫做畫素檢測。
畫素檢測需要得到每乙個紋理貼圖的畫素資料,為了訪問每乙個畫素,我們必須呼叫texture2d.getdata。通過這個方法你可以將紋理貼圖的資料複製到你所定義的乙個陣列,當然陣列的格式為預設的color型別。 1.
首先,你需要在
game
類中為每乙個貼圖宣告
color
陣列。
// the color data for the images; used for per-pixel collision
color persontexturedata;
color blocktexturedata;2.
之後,使用texture2d.getdata方法將貼圖中的每乙個畫素複製到你所定義的陣列當中。當然,這一步必須當紋理貼圖載入之後。在loadgraphicscontent方法中新增下面粗體**。
// load textures
blocktexture = content.load("content/block");
persontexture = content.load("content/person");
// extract collision data
blocktexturedata =
new color[blocktexture.width * blocktexture.height];
blocktexture.getdata(blocktexturedata);
persontexturedata =
new color[persontexture.width * persontexture.height];
persontexture.getdata(persontexturedata);3.
對每乙個紋理貼圖你都需要分配乙個
color
陣列,這個資料是一維的,也就是說貼圖的顏色資料會按照順序依次儲存到這個陣列當中。一旦這個陣列的空間被分配,那麼
getdata
函式會將紋理貼圖中的畫素資料填充入這個陣列當中。
現在你已經有了所需要的資料,那麼根據這些資料你可以完成畫素碰撞檢測。這個方法首先需要一對紋理題圖的包圍矩形和他們的顏色資料。 1.
首先,將下面的方法新增到你的**當中。
static bool intersectpixels(rectangle rectanglea, color dataa,
rectangle rectangleb, color datab)2.
這個方法主要包括兩個部分,第一,他將識別出兩個包圍矩形的重合部分,這個重合區域也許存在,也許不存在。第二,這個方法會迴圈的檢測重合區域的畫素顏色,如果發現物體的畫素產生了碰撞,那麼這個方法將返回
true
,如果經過對畫素的檢測沒有發現碰撞,那麼將返回
false。
3.將下面的**新增到intersectpixels方法當中。
// find the bounds of the rectangle intersection
int top = math.max(rectanglea.top, rectangleb.top);
int bottom = math.min(rectanglea.bottom, rectangleb.bottom);
int left = math.max(rectanglea.left, rectangleb.left);
int right = math.min(rectanglea.right, rectangleb.right);4.
這四個變數定義了矩形重合的區域。如果沒有重合區域的話,
right
的值會小於
left
或者bottom
的值會小於
top,或者這兩種情況同時存在。我們通過乙個巢狀的
for迴圈來自動判斷是否有重合區域。 5.
將下面的**依次新增如上面的方法。
// check every point within the intersection bounds
for (int y = top; y < bottom; y++)
}
}
// no intersection found
return false;
這個for
迴圈會依照從左至右,從上到下的順序讀取每乙個畫素的顏色,我們需要將矩形的世界座標轉換為本地座標。我們對本地座標進行判斷,如果兩者都不是0(
0代表透明)的話,那麼則可以判斷出現了碰撞。
注意
在教程1
當中我們已經講過紋理處理器會自動將洋紅色轉換為透明色。
現在你已經完成了畫素碰撞檢測的方法,你需要在原有的舉行碰撞的地方呼叫這個方法。 1.
在updata
方法中修改**如下。
// update each block
personhit = false;
for (int i = 0; i < blockpositions.count; i++)
// remove this block if it has fallen off the screen
if (blockpositions[i].y > window.clientbounds.height)
}2.
好了,編譯並執行這個遊戲。
你現在已經掌握了畫素碰撞檢測的技能了。
提供一下內容作為擴充套件。 ·
增加下落物體的大小和樣式。 ·
為遊戲角色新增保護罩 ·
新增獎勵物品
.如果對翻譯文章有疑問傳送郵件至傳送郵件至
XNA 2D碰撞教程2 畫素檢測
fw 本教程詳細講解了畫素碰撞檢測的實現。注意 這個教程的 是在前乙個教程 2d碰撞教程 1 矩形檢測中實現的,在進行下面的教程前請確保已經完成教程 1的學習。在前乙個例子當中,你已經通過舉行碰撞檢測實現了乙個躲避下落物體遊戲。而矩形只是通過你載入的紋理貼圖的大小來決定的,並不能準確的代表你的遊戲角...
XNA教程 2D遊戲 目錄索引
xna遊戲教程.2d 2d遊戲教程簡介 建立遊戲工程 新增asset 繪製背景 新增一門加農炮 發射炮彈 新增敵人ufo 摧毀ufo 記錄分數 其他擴充套件 extra credit community tutorials 什麼是asset?content pipeline是如何工作的?sprite...
2D遊戲中的碰撞檢測
近期做了乙個類似坦克大戰的android遊戲。關於碰撞檢測有一些收穫,記錄一下。開始的思路是,將遊戲分成行列組成的小塊,當玩家或者怪物移動到某塊時,就將此小塊的id改為玩家或者怪物的id,子彈和怪物的碰撞,也是同樣處理。但是這樣造成的問題就是,每次玩家和怪物都必須行走乙個整格仔。玩家的移動,看起來有...