2

シンプルなゲームの作業中に問題に遭遇し、かなり長い間それに固執していました。誰かが私にエレガントな解決策または正しい方向への一歩を提供してくれることを願っています.

私は現在、シンプルなトップダウン スクローラーを持っています。プレイヤーは今のところ単なる白い立方体で、マップの周りにはKryptonで作られた 45 度のライト コーンが回転しています。プレイヤーはライトに見られないようにする必要があるため、プレイヤーがライトアップされた領域の範囲内に入ったときにイベントを発生させるピクセル衝突メソッドを作成しようとしています。

Krypton には、ライトの周りに外接する長方形を返すプロパティがありますが、ライトのゾーン全体の周りに巨大な正方形を描画するため、衝突には使用できません。ライト。精度が欲しい。

また、ライトアップされたエリアの周りに三角形を描いてみましたが、ここでの問題は、光の一部が廊下を照らしているため、正確に拾うことができないため、必要なほど正確ではないことでした.さらに、光の範囲が実際にはマップの半分よりも大きいため、三角形は壁を通過しますが、ほとんどがシャドウ ハルによって遮られているだけです。プレイヤーは、壁の後ろのライトから隠れることができなければなりません。これが私が意味することのイメージの例です。画像

したがって、これを行う最善の方法は、プレーヤーのピクセルの 1 つの色が特定の .. RGB 値に変更されたかどうかを確認することであると考えました。これにはハードコーディングが必要になりますが、単純なゲームなので、このアプローチは気にしません。しかし、ここで私はいくつかの問題に遭遇します。

メソッドについて読みましたがTexture2D.GetData<>、これを実行できますが、実際にインポートされたテクスチャのカラー配列が返されます。これは常に白です。後処理された結果は返されません。シーンには複数のテクスチャが存在する可能性があるため、これは理にかなっています。

次に試したGraphicsDevice.GetBackBufferData<>のは、ビューポートのすべてのピクセルを返すもので、すぐに FPS がゼロになりました。特定の範囲のピクセルのみを取得するためのオーバーロードがありますが、私はいつも驚いているので、決してうまくいかないようです。インデックス外の例外。この方法を使用するときに私が試みることは次のとおりです。

Color[] colors = new Color[10]
GraphicsDevice.GetBackBufferData<Color(colors, 0, 10);

(単なる例ですが、なぜこれが機能しないのか理解できないようです。)

多かれ少なかれ追いかけるために、ビューポートの特定の領域または座標のカラー配列を取得する方法を探しているので、その配列のすべての色を比較して一致するかどうかを確認できます。

少し長い場合は申し訳ありませんが、何が欠けているのかわからないため、アドバイスやガイダンスをいただければ幸いです。これに関するほとんどのチュートリアルに従いましたが、2 つの衝突するテクスチャの色の値を比較しているようです。テクスチャですが、私が間違っていなければ、テクスチャ自体が実際に色を変えることはありません。これは、描画されるインポートされたアセットにすぎないためです。テクスチャが描画されている場所の色を取得して、変更があったかどうかを適切に確認する必要があると思います。

敬具

編集:

GetBackBufferData の引数としての四角形はうまく機能し、MultiSampling を無効にするとラグが存在しなくなります。@Bjarke Søgaard と @thomas88wp の提案に感謝します。

Color colorArray = new Color[player.Bounds.Width * player.Bounds.Height];
Color[] colors = new Color[player.Bounds.Width * player.Bounds.Height];
GraphicsDevice.GetBackBufferData<Color>(rec, colors, 0, colors.Count());
4

0 に答える 0