我试图将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之前调用。

10-07 19:07
查看更多