1
因此,我的碰撞檢測系統設置爲檢查字符的每個像素,標記collisionDetected,將違規字符模型的像素置於collisionDetectedX和collisionDetectedY中。它使用這些數據來確定有效的可移動區域的位置,並將該單元推回到其中。解決此問題的唯一方法是讓X和Y的碰撞類同時運行,還是可以修改此類以便同時正確執行兩個作業?謝謝你的時間,我一直在努力弄清楚我做錯了什麼。我爲草率代碼道歉。我把它清理了一下(這真的很糟糕),但我意識到這不是最終產品的價值。2D碰撞檢測系統在對角移動時沒有反應
class Collision
{
public Color[,] DataMiner(Texture2D background)
{
Color[,] collision2D;
Color[] collision1D;
collision1D = new Color[background.Width * background.Height];
background.GetData(collision1D);
collision2D = new Color[background.Width, background.Height];
for (int x = 0; x < background.Width; x++)
for (int y = 0; y < background.Height; y++)
collision2D[x, y] = collision1D[x + y * background.Width];
return collision2D;
}
public void CollisionChecker(Color[,] background, ref Vector2 position)
{
Rectangle character;
character.Width = 32;
character.Height = 32;
character.X = Convert.ToInt16(position.X);
character.Y = Convert.ToInt16(position.Y);
int n = 0;
int n2 = 0;
bool collisionDetected = false;
int collisionDetectedX = 0;
int collisionDetectedY = 0;
while (n2 < character.Width)
{
n = 0;
while (n < character.Height)
{
if (background[character.X + n2, character.Y + n] == Color.Black)
{
collisionDetected = true;
collisionDetectedX = n2;
collisionDetectedY = n;
}
n++;
}
n2++;
}
if (collisionDetected == true)
{
collisionDetectedX += Convert.ToInt16(position.X);
collisionDetectedY += Convert.ToInt16(position.Y);
if (background[collisionDetectedX, collisionDetectedY + 2] == Color.Red)
position.Y += 1;
else if (background[collisionDetectedX, collisionDetectedY - 2] == Color.Red)
position.Y -= 1;
else if (background[collisionDetectedX + 2, collisionDetectedY] == Color.Red)
position.X += 1;
else if (background[collisionDetectedX - 2, collisionDetectedY] == Color.Red)
position.X -= 1;
else if (background[collisionDetectedX - 2, collisionDetectedY - 2] == Color.Red)
{
position.X -= 1;
position.Y -= 1;
}
else if (background[collisionDetectedX - 2, collisionDetectedY + 2] == Color.Red)
{
position.X -= 1;
position.Y += 1;
}
else if (background[collisionDetectedX + 2, collisionDetectedY - 2] == Color.Red)
{
position.X += 1;
position.Y -= 1;
}
else if (background[collisionDetectedX + 2, collisionDetectedY + 2] == Color.Red)
{
position.X += 1;
position.Y += 1;
}
collisionDetected = false;
}
}
public void Update(Texture2D background, ref Vector2 position)
{
CollisionChecker(DataMiner(background), ref position);
}
}
嗯,我沒有10代表尚未所以我不能回答我的問題,但我想通了:
我改變了if語句有點條件。我不得不刪除其他的,因爲當它發現一個需要改變的時候,它會放下嵌套if的其餘部分。既然它是在解決這個問題之後馬上做所有的事情,那麼當它靠近一個角落時,它會在平坦的牆壁上向右或向左「滑」。我添加了條件來檢查collisionDetected是否仍然爲true,並使每次更改都將其還原爲false。
祝您有個美好的一天,希望有人能從我的錯誤中學習!
if (collisionDetected == true)
{
collisionDetectedX += Convert.ToInt16(position.X);
collisionDetectedY += Convert.ToInt16(position.Y);
if (background[collisionDetectedX, collisionDetectedY + 2] == Color.Red && collisionDetected)
{
position.Y += 1;
collisionDetected = false;
}
if (background[collisionDetectedX, collisionDetectedY - 2] == Color.Red && collisionDetected)
{
position.Y -= 1;
collisionDetected = false;
}
if (background[collisionDetectedX + 2, collisionDetectedY] == Color.Red && collisionDetected)
{
position.X += 1;
collisionDetected = false;
}
if (background[collisionDetectedX - 2, collisionDetectedY] == Color.Red && collisionDetected)
{
position.X -= 1;
collisionDetected = false;
}
}
http://gamedev.stackexchange.com/questions/27228/pixel-collision-detecting-corners – Cyral 2012-07-17 21:09:40
也許這可以幫助:http://gamedev.stackexchange.com/questions/22118/how-can-i-使用矩形相交到解決-碰撞功能於XNA – EnemyArea 2012-07-18 09:25:27