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.Width
、SS.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
です。少なくとも、そのようなばかげた状態が問題の一部ではないことを嬉しく思います。