2

C# を使用して XNA で小さなトップ ダウン シューティング ゲームを構築しており、ピクセルごとの衝突検出を実装しようとしています。衝突を含む四角形を返す標準の境界ボックス検出に沿って、次のコードを実行します。

private bool perPixel(Rectangle object1, Color[] dataA, Rectangle object2, Color[] dataB)
    {
        //Bounds of collision
        int top = Math.Max(object1.Top, object2.Top);
        int bottom = Math.Min(object1.Bottom, object2.Bottom);
        int left = Math.Max(object1.Left, object2.Left);
        int right = Math.Min(object1.Right, object2.Right);

        //Check every pixel
        for (int y = top; y < bottom; y++)
        {
            for (int x = left; x < right; x++)
            {
                //Check alpha values
                Color colourA = dataA[(x - object1.Left) + (y - object1.Top) * object1.Width];
                Color colourB = dataB[(x - object2.Left) + (y - object2.Top) * object2.Width];

                if (colourA.A != 0 && colourB.A != 0)
                {
                    return true;
                }
            }
        }
        return false;
    }

それがうまくいくと確信していますが、スプライトシートからチェックするオブジェクトのいくつかを取得しようとしています。このコードを使用してカラーデータを取得しようとしていますが、エラーが発生しています「渡されたデータのサイズがこのリソースに対して大きすぎるか小さすぎます」と言っています。

 Color[] pacmanColour = new Color[frameSize.X * frameSize.Y];

                pacman.GetData(0, new Rectangle(currentFrame.X * frameSize.X, currentFrame.Y * frameSize.Y, frameSize.X, frameSize.Y), pacmanColour,
                    currentFrame.X * currentFrame.Y, (sheetSize.X * sheetSize.Y));

私は何を間違っていますか?

4

1 に答える 1

1

Texture2D カラーを処理するための私の方法をお見せしましょう

ファイルから事前に作成された構造をロードするために、次の手法を使用しました

//Load the texture from the content pipeline
Texture2D texture = Content.Load<Texture2D>("Your Texture Name and Directory");

//Convert the 1D array, to a 2D array for accessing data easily (Much easier to do Colors[x,y] than Colors[i],because it specifies an easy to read pixel)
Color[,] Colors = TextureTo2DArray(texture);

そして機能は…

 Color[,] TextureTo2DArray(Texture2D texture)
    {
        Color[] colors1D = new Color[texture.Width * texture.Height]; //The hard to read,1D array
        texture.GetData(colors1D); //Get the colors and add them to the array

        Color[,] colors2D = new Color[texture.Width, texture.Height]; //The new, easy to read 2D array
        for (int x = 0; x < texture.Width; x++) //Convert!
            for (int y = 0; y < texture.Height; y++)
                colors2D[x, y] = colors1D[x + y * texture.Width];

        return colors2D; //Done!
    }

簡単に使用できる色の 2D 配列を返すため、Colors[1,1] (ピクセル 1,1 の場合) が何に等しいかを簡単に確認できます。

于 2012-12-22T20:57:47.877 に答える