使用旋转精灵SharpDX进行碰撞检测

时间:2014-08-31 17:27:04

标签: c# xna sharpdx

我正在写一个SharpDx.Toolkit(XNA)游戏。我在互联网上搜索了如何编程碰撞检测,我发现了这个:

static bool perPixel(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++)
                {
                    if (dataA[(x - rectangleA.Left) + (y - rectangleA.Top) * rectangleA.Width] != new Color(0, 0, 0, 0) && dataB[(x - rectangleB.Left) + (y - rectangleB.Top) * rectangleB.Width] != new Color(0, 0, 0, 0))
                    {
                        // 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;
        }

此代码工作正常,但仅适用于非旋转精灵。所以我尝试添加矩阵变换,但它不起作用。

有没有人有想法,怎么做?

谢谢你, 基督教

编辑:游戏是2D游戏。

1 个答案:

答案 0 :(得分:1)

在大多数情况下,每像素碰撞都是过度杀伤,除了编程练习之外我不会推荐它。

您几乎总是可以使用其他方法来查找会导致较少错误并且性能较低的碰撞。

您可以使用物理引擎或找到其他方法。

我认为有些方法可以很好地适用于您的情况:

  1. OBB-OBB碰撞
  2. 圆圈碰撞
  3. 使用这些方法,您只需检查边界是否相交,而不是相互检查每个像素。