我试图将SetData方法用作我在游戏中使用的基于像素的碰撞检测机制的一部分。
通常,我想将纹理的重叠像素设置为透明。
在尝试使用SetData时,我不断收到以下异常:
“在GraphicsDevice上主动设置资源时,不能在资源上调用SetData。在调用SetData之前,请先从设备上取消设置它。”
我确实设法在StockOverFlow中找到一些几乎与此类似的问题,但是我仍然不确定如何处理该异常:
我试图从Draw方法调用SetData,但是异常不断出现。
我试图了解我是否应该以某种方式从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);
...}
最佳答案
像素上的碰撞检测效率不高,您必须使用冷色阵列,在这种情况下您必须关心比例和旋转因子。
如果您正在处理renderTarget,则应将renderTarget设置为null,以便可以更改像素;如果不使用renderTarget,则要在Draw方法中进行操作,则应在Update中更改像素(更好),那么您应该在spriteBatch.Begin之前调用。