2011-12-24 78 views
2

我尝试使用SetData方法作为我在游戏中使用的基于像素的碰撞检测机制的一部分。 一般来说,我想将纹理的重叠像素设置为透明。如何正确使用XNA的SetData方法

尝试使用SetData时,我一直收到以下异常: “在GraphicsDevice上主动设置资源时,您不能调用SetData,在调用SetData之前将其从设备中取消设置。

我还是设法找到处理此异常StockOverFlow有的几乎类似的问题,但我仍然不知道如何处理这个异常:

  1. 我试图从Draw方法调用的SetData ,但例外不断出现。
  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之前调用它。

+0

我同意你的观点,基于像素的检测效率不高,但它要求我为我的任务的一部分:)即便如此,本场比赛并没有进行这种检测是每帧,但前提是发现基于矩形的碰撞。关于SetData异常 - 你是对的。我发现错误的触发器是一个共享的SpriteBatch组件,它可能因为其“Begin方法”而将游戏的流程搞乱了。非常感谢您的帮助:) – AdiB 2011-12-24 16:57:56

+0

不客气。 – icaptan 2011-12-24 20:57:52