动画精灵时每像素碰撞

时间:2012-10-22 00:07:49

标签: xna jquery-animate pixel

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

 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;

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

1 个答案:

答案 0 :(得分:1)

你可以得到一个完整的精灵表格纹理数组,只使用当前帧。

假设您有精灵表,stride是像素与其下方像素的偏移量。这可以是精灵表的宽度。此外,您拥有当前帧第一个像素的位置x0y0。然后你只需要修改索引计算:

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

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