XNA系列教程 2D碰撞教程2 畫素檢測

2021-04-13 05:24:01 字數 4259 閱讀 1212

本教程詳細講解了畫素碰撞檢測的實現。

注意

這個教程的**是在前乙個教程:

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.

好了,編譯並執行這個遊戲。

你現在已經掌握了畫素碰撞檢測的技能了。

提供一下內容作為擴充套件。 ·

增加下落物體的大小和樣式。 ·

為遊戲角色新增保護罩 ·

新增獎勵物品

.如果對翻譯文章有疑問傳送郵件至傳送郵件至

[email protected]

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,子彈和怪物的碰撞,也是同樣處理。但是這樣造成的問題就是,每次玩家和怪物都必須行走乙個整格仔。玩家的移動,看起來有...