如何正确使用XNA's SetData方法

本文关键字:SetData 方法 何正确 XNA | 更新日期: 2023-09-27 18:18:41

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

在尝试使用SetData时,我一直收到以下异常:当资源在GraphicsDevice上被积极设置时,你不能调用SetData。在调用SetData之前将其从设备中移除。"

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

  1. 我尝试从Draw方法调用SetData,但异常不断出现。
  2. 我试图理解我是否应该以某种方式从GraphicsDevice中删除纹理,但唯一的方法似乎是在GraphicsDevice中使用纹理的索引。纹理[idx]并将其设置为null。如果我不在类中保存这个索引呢?

我的游戏,自然地,我认为,拥有多种纹理在它里面(其中一些是添加到游戏。组件也是如此)。也许这就是问题的根源?

我附加了一小部分我的代码…我看不出有什么理由要发更多的。

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);
...}

如何正确使用XNA's SetData方法

  1. 在像素的碰撞检测是不有效的,你必须冷颜色阵列,你必须关心的规模和旋转因素。

  2. 如果你正在使用renderTarget,你应该将renderTarget设置为null,这样你就可以改变像素,如果你不使用renderTarget,你应该在更新(这是更好的)中改变像素,如果你想在绘制方法中这样做,那么你应该在spriteBatch之前调用is。开始。