如何正确使用XNA的SetData方法

时间:2011-12-24 15:08:38

标签: c# exception graphics xna collision-detection

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

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

我确实找到了一些在StockOverFlow中处理此异常的几乎相似的问题,但我仍然不确定如何处理此异常:

  1. 我试图从Draw方法调用SetData,但Exception不断出现。
  2. 我试图理解我是否应该以某种方式从GraphicsDevice中删除纹理,但是这样做的唯一方法似乎是使用GraphicsDevice.Textures [idx]中的纹理索引并将其设置为null。如果我在班上没有这个索引怎么办?
  3. 我认为,我的游戏中包含多个纹理(其中一些也添加到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);
    ...}
    

1 个答案:

答案 0 :(得分:0)

  1. Pixel的碰撞检测效率不高,你需要冷色阵,你必须关注比例和旋转因素。

  2. 如果您正在处理renderTarget,则应将renderTarget设置为null,以便可以更改像素,如果您不使用renderTarget,则应更改Update中的像素(如果您想更改)在Draw方法中执行,然后应该在spriteBatch.Begin之前调用。