1

Texture2DからTextureの一部を削除する方法を知りたいです。弾丸が惑星に「食い込む」と、惑星を少しずつ爆破したいという簡単なゲームがあります。

物理学はすでに機能していますが、テクスチャを適切にカットする方法に固執しています。

Texture2Dの位置と半径を入力として受け取り、新しいTexture2Dを返す関数を作成する必要があります。

これが私が達成したいことの前後のTexture2Dの例です。 http://img513.imageshack.us/img513/6749/redplanet512examplesmal.png

また、クレーターの穴の周りに薄い茶色の境界線を描いたことにも注意してください。これが可能であれば、それは大きなボーナスになります。

4

3 に答える 3

4

主題について多くのグーグルを行った後、私が望む効果を達成するための最良かつ最速の方法は、ピクセルシェーダーを使用することです。

具体的には、「アルファ マッピング」と呼ばれるシェーダー メソッドです。アルファ マッピングは、元のテクスチャと、どの部分を表示するかどうかを定義する別のグレースケール テクスチャを使用して行われます。

シェーダーの考え方は、元のテクスチャの各ピクセルを調べて、グレースケール イメージの各ピクセルが同じ座標でどの程度黒くなるかを確認することです。グレースケール画像のピクセルが黒くなるほど、元のテクスチャのピクセルのアルファ値が高くなります (見やすくなります)。これはすべて GPU で行われるため、非常に高速であり、CPU はゲームの実際のロジックを実行する準備ができています。

私の例では、グレースケール画像として使用する黒い画像を作成し、削除したい部分に対応する白い円をその上に描きます。

これを行う XNA 4 用の作業ソース コードを含む MSDN の例を見つけました (猫の例):

http://create.msdn.com/en-US/education/catalog/sample/sprite_effects

編集:私はこれをうまく機能させました。ここにソース コードを含む小さなチュートリアルを作成しました: http://syntaxwarriors.com/2012/xna-alpha-mapping-with-pixel-shaders/

于 2012-02-14T09:29:00.587 に答える
0

ここで私のクラスを見てください: http://www.codeproject.com/Articles/328894/XNA-Sprite-Class-with-useful-methods

1. 惑星の Sprite クラスのオブジェクトを作成する
だけです。

2.弾丸が惑星に命中したら、「GetCollisionPoint(Sprite b)」メソッドを使って衝突点の中心で円 texure2d を作成します。

-角が透明な Circle.png を
作成することもできます -または、数学を使用して Circle を作成することもできます (これは、弾丸の力が必要な場合に適しています)。

3.次に、円の Sprite オブジェクトを作成します

4.「GetCollisionArea(Sprite b)」を使用して、オーバーラップ領域を取得します

5.「ChangeBatchPixelColor(List pixel, Color color)」を使用します。ここで、ピクセルは重複領域であり、色は Color.FromNonPremultiplied(0, 0, 0, 0) です。

-円を描く必要はまったくないことに注意してください。使用した後は、それを破壊するか、さらに使用するためにそのままにしておくことができます

于 2012-02-14T07:11:51.653 に答える
0

これを行う良い方法は、惑星テクスチャの上に alphablend を使用して「穴テクスチャ」をレンダリングすることです。元のテクスチャの上に不可視の円を描くようなものだと考えてください。いくつかの素敵なリンクworms-style-destructible-terrainについては、このスレッドをご覧ください。

茶色のエッジを実現するには、同様のアプローチをとる必要があると思います。最初に、たとえば半径 10px で穴を地形にレンダリングします。次に、同じ原点から半径を少し大きくして、たとえば 12px の別の円をレンダリングします。次に、この円をブレンドモードに設定して、茶色になるようにする必要があります。

于 2012-02-13T10:02:44.697 に答える