0

そこで、XNA で練習用に小惑星のようなゲームを作成しています。ここの RBWhitaker の wiki で説明されているように、テクスチャ アトラスに使用している大きなテクスチャがあります: http://rbwhitaker.wikidot.com/texture-atlases-1

私は今、wiki から分岐して、自分の船とエイリアンの衝突検出を試みています。問題は、アトラスからの現在のスプライトを、正確な衝突検出を行うことができる別の texture2d として必要とすることです。texture2d.GetData メソッドを使用した例を読みましたが、機能する実装を取得できないようです。そのメソッドまたはその他のオプションの詳細な実装は大歓迎です。

4

1 に答える 1

4

アトラステクスチャで使用Texture.GetData<Color>()して、個々のピクセルを表す色の配列を取得します。

Color[] imageData = new Color[image.Width * image.Height];
image.GetData<Color>(imageData);

テクスチャからのデータの長方形が必要な場合は、次のような方法を使用します。

Color[] GetImageData(Color[] colorData, int width, Rectangle rectangle)
{
    Color[] color = new Color[rectangle.Width * rectangle.Height];
    for (int x = 0; x < rectangle.Width; x++)
        for (int y = 0; y < rectangle.Height; y++)
            color[x + y * rectangle.Width] = colorData[x + rectangle.X + (y + rectangle.Y) * width];
    return color;
}

上記のメソッドrectangleは、が元のテクスチャの範囲外である場合、インデックスが範囲外の例外をスローします。widthパラメータはテクスチャの幅です。

sourceRectangle特定のスプライトの使用法:

Color[] imagePiece = GetImageData(imageData, image.Width, sourceRectangle);

別のテクスチャが本当に必要な場合(ピクセルごとの衝突のカラーデータが実際に必要だと思いますが)、次のようにすることができます。

Texture2D subtexture = new Texture2D(GraphicsDevice, sourceRectangle.Width, sourceRectangle.Height);
subtexture.SetData<Color>(imagePiece);

補足-衝突テストでテクスチャからのカラーデータを常に使用する必要がある場合は、テクスチャとしてではなく、色の配列として保存してください。テクスチャからデータを取得するには、CPUの待機中にGPUが使用されるため、パフォーマンスが低下します。

于 2012-12-13T02:12:42.287 に答える