0

XNA ゲームでピクセルごとのコリジョンをスプライト シートと統合しようとしています。私は主にこれに基づいていますが、うまくいきません。

スプライトシートの左上隅にあるスプライトからデータを取得するために私が行っていることは次のとおりです。正常に動作しているようです - 少なくともエラーはありません。

Rectangle SpriteSource = new Rectangle(0, 0, 32, 32);
ColorData = new Color[SpriteSource.Width * SpriteSource.Height];
Owner.Spritesheet.GetData(0, SpriteSource, ColorData, SpriteSource.X * SpriteSource.Y, 
SpriteSource.Width * SpriteSource.Height);

左上にないスプライトを取得するには:

Rectangle SpriteSource = new Rectangle(48, 32, 16, 32);
ColorData = new Color[SpriteSource.Width * SpriteSource.Height];
Owner.Spritesheet.GetData(0, SpriteSource, ColorData, SpriteSource.X * SpriteSource.Y,
SpriteSource.Width * SpriteSource.Height);

四角形を (48, 32) オフセットする以外は、まったく同じコードです。ただし、何らかの理由で、「このパラメーターは配列内の有効なインデックスである必要があります。パラメーター名: dataIndex」という例外がスローされます。

私は何を間違っていますか?この場合、dataIndex は何を参照していますか? ColorData 配列ですか、それとも実際の Texture2D ですか? また、特別な「ミップマッピング」を行っていない場合 (それが何かは完全にはわかりませんが、大まかな考えはあります)、ミップマッピング レベルとして 0 を使用しますよね?

編集: いくつかの詳細情報 (SS = SpriteSource、O.Tex = Owner.Spritesheet):

である限りSS.X <= O.Tex.Width - SS.WidthSS.Y == 0コードは正常にコンパイル/実行されます。の場合SS.X > O.Tex - SS.Width、完全に予想される「このリソースに対して四角形が大きすぎるか小さすぎます」というエラーが発生します。Y を変更し、X をゼロに保つ場合も同じです。

ただし、次のすべてが true: のSS.X > 0 && SS.Y > 0 && (SS.X * SS.Y) < (SS.Width * SS.Height)場合、同様に苛立たしいが別のエラー「このパラメーターは配列内の有効なインデックスである必要があります。パラメーター名: elementCount」が生成されます。

EDIT2: elementCount エラーについて少し間違っていたようSS.X * SS.Y > SS.Width * SS.Heightです。少なくとも、そのようなばかげた状態が問題の一部ではないことを嬉しく思います。

4

1 に答える 1

1

私は XNA プログラマーではありませんが、Spritesheet が Texture2D である場合問題が発生する理由はわかっていると思います。パラメータを詳しく見てみましょう。

  • int レベル - ミップマップ レベル
  • Nullable - コピーするテクスチャのセクション。nullは、データがテクスチャ全体からコピーされることを示します
  • T[] data - データの配列 int
  • startIndex - 取得する最初の要素のインデックス
  • int elementCount - 取得する要素の数

2 番目のパラメーターとして SpriteSource を渡すため、既にテクスチャのサブセクションが選択されています。4 番目のパラメーターは、2 番目のパラメーターとして渡す四角形 (SpriteSource) の開始インデックスです!

最初のケースでは、GetData の 4 番目のパラメーターとして 0 を効果的に渡すため、すべてが期待どおりに機能します (SpriteSource.X と SpriteSource.Y の両方が 0 で、0 * 0 = 0)。2 番目のケースは失敗します。これは、開始インデックスを 1024 にする必要があり、SpriteSource のサイズ (16 * 32 = 512) よりも大きいためです。4 番目のパラメーターとして 0 を渡すと、「SourceSprite のインデックス 0 から開始する」ことを意味するため、機能します。

したがって、SourceSprite が常に必要なスプライト シート内のスプライトの四角形である場合は、startIndex として 0 を渡すと、目的のスプライトを取得できます。

おもう...

于 2013-05-11T07:05:57.947 に答える