我正在尝试制作玩家碰撞系统,玩家将与屏幕上绘制的对象发生碰撞。我使用基于像素的系统,我创建了4个矩形,顶部,底部,左侧和右侧。当它们中的任何一个与该图像碰撞时,公式将检查矩形和块是否相交,如果是,则颜色是否相交。
现在我使用的这个系统是这样的,我可以创建任何类型的图像,它将无需制作瓷砖地图。让我举个例子,这个区块在中心有一个洞:
现在如果玩家在区块内,即使玩家在矩形内,玩家仍然会与该区块发生碰撞。
但是有问题。
当我在黑匣子的侧面使用带有一些板形式的测试地图时,这个想法是有效的。玩家确实停下来,并且当玩家仍然在矩形内时可以自由移动,但是玩家在停止之前会稍微陷入障碍物。
*我如何解决这个问题?
*我想不使用矩形碰撞到系统类型并使用它。还有更好的方法吗?
*
这是交叉像素如何工作的示例。使用播放器的底部矩形和测试图。
方法IntersectPixels
需要两个矩形和两个颜色数据;获取底部矩形和玩家将碰撞的图像的矩形,以及两个图像的Color[]
。
public Rectangle bottomRectangle;
Rectangle mapRectangle;
Color[] mapColor;
Color[] bottomColor;
首先,每个矩形必须在其内部具有纹理才能工作。所以需要有两个纹理:
Texture2D bottomTexture;
Texture2D mapTexture;
然后将每个图像的纹理和颜色放在LoadContent()中的等式中。
Color =
new Color[Texture.Width * Texture.Height];
Texture.GetData(Color);
然后在Rectangle和Color都正确设置IntersectPixels
方法:
static bool IntersectPixels(Rectangle rectangleA, Color[] dataA,
Rectangle rectangleB, Color[] dataB)
{
// 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);
// Check every point within the intersection bounds
for (int y = top; y < bottom; y++)
{
for (int x = left; x < right; x++)
{
// Get the color of both pixels at this point
Color colorA = dataA[(x - rectangleA.Left) +
(y - rectangleA.Top) * rectangleA.Width];
Color colorB = dataB[(x - rectangleB.Left) +
(y - rectangleB.Top) * rectangleB.Width];
// If both pixels are not completely transparent,
if (colorA.A != 0 && colorB.A != 0)
{
// then an intersection has been found
return true;
}
}
}
// No intersection found
return false;
}
答案 0 :(得分:0)
一种解决方案是首先检查碰撞,然后更新位置并绘制。通过这个你可以检查碰撞一个更新位置发生之前你可以在这种情况下防止更新位置...设置速度ot 0或其他任何东西。