2011-12-24 6 views
2

私はゲームで使用するピクセルベースの衝突検出メカニズムの一部としてSetDataメソッドを使用しようとしています。 一般に、テクスチャの重なり合うピクセルを透明に設定したいとします。XNAのSetDataメソッドを正しく使用する方法

SetDataを使用しようとしているうちに、私は次の例外を受け取ります。 "SetDataを呼び出す前に、GraphicsDevice上でアクティブに設定されているリソースに対してSetDataを呼び出すことはできません。

私はStockOverFlowでこの例外に対処するいくつかのほぼ同様の質問を見つけるために管理しなかった、まだ私はまだ、この例外に対処する方法がわからないです:私はDrawメソッドからSetDataメソッドを呼び出すようにしようとしました

  1. しかし、例外は現れ続けます。
  2. GraphicsDeviceからテクスチャを削除する必要があるかどうかを確認しようとしましたが、これを行う唯一の方法はGraphicsDevice.Textures [idx]のテクスチャのインデックスを使用してnullに設定しているようです。クラスでこのインデックスを保持しないとどうなりますか?

私のゲームでは、当然のことながら、複数のテクスチャが内部に保持されています(Game.Componentsにもいくつか追加されています)。おそらく、これが問題の根源だろうか?

私のコードのごく一部を添付しています...それ以上のポストをする本当の理由はありません。

private void collisionDetected() 
{... 
     for (int col = collisionLeftCordinate; col < collisionRightCordinate; col++) 
     { 
      for (int row = collisionTopCordinate; row < collisionBottomCordinate - 1; row++) 
      { 
       if (m_BarrierPixels[col + row * (int)this.Texture.Width] != Color.Transparent) 
       { 
        m_BarrierPixels[col + row * (int)this.Texture.Width] = Color.Transparent; 
        m_TransparentPixelsCounter++; 
       } 
      } 
     } 

     this.Texture.SetData(m_BarrierPixels); 
...} 

答えて

0
  1. ピクセルのオーバー衝突検出あなたは、スケールと回転率を気にする必要は冷たい色の配列に持って、効率的ではありません。

  2. renderTargetを使用している場合は、renderTargetをnullに設定する必要があります。この場合、renderTargetを使用していない場合、必要に応じてUpdateでピクセルを変更する必要がありますDrawメソッドでは、spriteBatch.Beginの前にisを呼び出す必要があります。

+0

私はあなたに同意しますが、ピクセルベースの検出は効率的ではありませんが、それは私の仕事の一部として私に要求されています:)でも、ゲームはフレームごとにこの検出を行いません矩形ベースの衝突を検出します。 SetData例外について - あなたは正しい。私は、エラーのトリガーがSpriteBatchコンポーネントの共有であったことを発見しました。これは、おそらく 'Beginメソッド'のためにゲームの流れを乱してしまいました。ご協力いただきありがとうございます:) – AdiB

+0

よろしくお願いします。 – icaptan

関連する問題