4

2D プロジェクトに XNA を使用しています。問題があり、それを解決する方法がわかりません。たとえば、画面に描画されるテクスチャ (画像) があります。

|+++|+++|
|---|---|
|+++|+++|

今、私はその構造/画像の一部を破壊して、次のようにしたいと考えています:

|+++|
|---|---|
|+++|+++|

そのため、新しい画像でも衝突が機能するようになりました。

この問題を解決するには、どの方法がよいでしょうか。

  1. テクスチャ全体を、破壊された場所が透明な別のテクスチャと交換します。
  2. spriteBatch.Draw(sourceRectangle, destinationRectangle) でいくつかのトリックを使用して、目的の長方形を描画し、これを何らかの方法で衝突チェックも行います。
  3. テクスチャを 4 つの小さなテクスチャに分割し、それぞれが独自の描画/衝突検出を担当します。
  4. 私が知らない他のスマートなお尻の方法を使用してください。

どんな助けでも大歓迎です。さらに説明や例が必要な場合はお知らせください。

編集:明確にするために、これの使用例を提供します。4x4 の壁を想像してみてください。撃たれると、その壁の 1x1 の部分が少し破壊されます。

4

4 に答える 4

1

私は3番目のオプションを取ります:

3 - テクスチャを 4 つの小さなテクスチャに分割します。それぞれが独自の描画/衝突検出を担当します。

難しいことではありません。基本的には TileSet 構造体と同じです。ただし、このアプローチに合わせてコードを変更する必要があります。Tiles について少し読んでください: http://www-cs-students.stanford.edu/~amitp/gameprog.html#tiles 多くのサイトや本で、Tiles とそれを使用してゲームの世界を構築する方法について述べられています。しかし、このロジックは、全体が小さな部分から堆肥になっているすべてのものに使用できます。

他のオプションについて簡単に説明します。

1 - テクスチャ全体を、破壊された場所で透明な別のテクスチャと交換します。

いや、ポジションごとにイメージが違うのはまずい。テクスチャを変更する必要がある場合は?すべての画像をもう一度リメイクしますか?

2 - spriteBatch.Draw(sourceRectangle, destinationRectangle) でいくつかのトリックを使用して、目的の長方形を描画し、これを何らかの方法で衝突チェックも行います。

残念ながら、spriteBatch.Draw は Rectangles でのみ機能するため、機能しません :(

4私が知らない他のスマートなお尻の方法を使用してください。

私はこれに魔法を想像することはできません。たぶん、別の画像を使用してマスクを作成できます。しかし、それは非常に処理費用がかかります。

于 2009-04-30T01:09:58.207 に答える
0

最終的にオプション 3 を選択しました。基本的に、テクスチャと寸法を含む Tile クラスがあります。ディメンション n は、そのタイル内に n*n サブタイルがあることを意味します。また、どのタイルが破壊されたかどうかを追跡する配列もあります。私のクラスは擬似コードで次のようになります。

 class Tile
     texture
     dimention
     int [,] subtiles; //0 or 1 for each subtile

     public Tile() // constructor
         subtiles = new int[dimention, dimention];
         intialize_subtiles_to(1);

     public Draw() // this is how we know which one to draw
        //iterate over subtiles
        for(int i..
          for(int j ...)
             if(subtiles[i,j] == 1)
                Vector2 draw_pos = Vector2(i*tilewidth,
                                      j*tileheight)                       
                spritebatch.Draw(texture, draw_pos)

同様の方法で、衝突をチェックする衝突メソッドがあります。

   public bool collides(Rectangle rect)
       //iterate over subtiles 
       for i...
          for j..
              if(subtiles[i,j]==0) continue;

              subtile_rect = //figure out the rect for this subtile
              if(subtile_rect.intersects(rect))
                   return true;

       return false;

等々。それぞれの値を 0 に設定して特定のサブタイルを「破棄」する方法と、タイル全体が破棄されたかどうかを確認する方法を想像できます。この手法を使用すると、サブタイルはすべて同じテクスチャになります。これまでのところ、より簡単な解決策は考えられません。

于 2009-05-04T12:37:49.580 に答える
0

Ziggyware でこの記事をチェックしてください。それは変形可能な地形についてであり、あなたが探しているものかもしれません. 基本的に、この手法には、非表示にするピクセルを透明に設定することが含まれます。

于 2009-04-29T23:10:57.820 に答える
0

オプション #3 が機能します。

より堅牢なシステム (ボックスに限定したくない場合) は、ピクセルごとの衝突検出を使用します。プロセスは基本的に次のように機能します。

  1. 各オブジェクトの境界ボックス (または円) を計算します
  2. 2 つのオブジェクトが重なっているかどうかを確認する
  3. オーバーラップごとに、スプライトを非表示のサーフェスにブリットし、ピクセル値を比較します。2 番目のスプライトからピクセルを描画しようとしたときにピクセルが既に設定されている場合は、衝突が発生しています。

XNA の良い例を次に示します (実際には別の Ziggyware 記事): 2D Per Pixel Collision Detection

その他のリンク:

誰かがピクセルごとの衝突検出を説明できますか

XNA 2-d ピクセルごとの衝突

于 2009-04-30T02:04:09.667 に答える