因此,我的碰撞检测系统设置为检查角色的每个像素,标记碰撞检测,将违规角色模型的像素放入碰撞检测 X 和碰撞检测 Y。它使用这些数据来确定有效的可移动区域在哪里,并将单元推回其中。解决这个问题的唯一方法是同时运行 X 和 Y 的碰撞类,还是我可以修改这个类以同时正确地完成这两项工作?谢谢你的时间,我一直在发疯,试图找出我做错了什么。我为草率的代码道歉。我把它清理了一下(真的是一团糟),但我意识到它不值得最终产品。
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 语句的条件。我不得不删除 else,因为当它找到需要更改的 if 时,它只会删除其余的嵌套 if。由于它是一次完成所有这些,因此在解决此问题后,如果靠近角落,它在靠着平坦的墙壁时会向右或向左“滑动”。我添加了条件来检查碰撞检测是否仍然为真,并使每次更改都将其恢复为假。
祝你有美好的一天,希望有人能从我的错误中吸取教训!
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;
}
}