0

这就是我用来检测碰撞的方法。

 public static bool IntersectPixels(Rectangle rectangleA, Color[] dataA, Rectangle rectangleB, Color[] dataB)
    {
        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);
        for (int y = top; y < bottom; y++)
        {
            for (int x = left; x < right; x++)
            {
                Color colorA = dataA[(x - rectangleA.Left) + (y - rectangleA.Top) * rectangleA.Width];
                Color colorB = dataB[(x - rectangleB.Left) + (y - rectangleB.Top) * rectangleB.Width];
                if (colorA.A != 0 && colorB.A != 0)
                {
                    return true;
                }
            }
        }
        return false;
    }:

在我想为东西制作动画之前,它工作得很好。所以我有一个大约 12 帧的纹理精灵。我需要做的是获取每一帧的颜色数据数组。这就是我获取颜色数据数组的方式:

 Color[] playerColorArray = new Color[playerColorArray.X * playerColorArray.Y];
 PlayerTexture.GetData(playerColorArray);
 CData = playerColorArray;

现在我的猜测是每次帧更改时我都必须更新纹理数据有没有办法只从每个帧中获取颜色数据?

4

1 回答 1

1

您可以获得完整精灵表纹理的数组,并且仅使用当前帧。

假设您有一个精灵表,并且stride是一个像素到它下面的像素的偏移量。这可以是精灵表的宽度。此外,您还有x0当前y0帧第一个像素的位置。然后你只需要修改索引计算:

int posXInFrame = (x - rectangleA.Left);
int posYInFrame = (y - rectangleA.Top);
Color colorA = dataA[(posXInFrame + x0) + (posYInFrame + y0) * stride];

可能,您已经在其他地方进行了计算,并且可以将这些值传递给函数x0y0

于 2012-10-22T21:19:11.087 回答