XNA new Texture2D保留旧数据

时间:2011-07-27 14:57:55

标签: c# xna texture2d

我有一个奇怪的问题,我相信我相对缺乏XNA框架的知识会阻止我修复。

基本上我有一个Texture2D引用设置为Texture2D的新实例。在运行期间,它的一些像素被设置,这一切都可以很好地在游戏循环中绘制。

奇怪的是,如果我将引用设置为null,(它只会绘制,如果不为null)它按预期不会绘制。

稍后,我将引用设置为新的Texture2D并开始将其绘制到屏幕。问题是它保存了原始Texture2D对象的所有数据。

修改

对不起我以前不清楚。

我拥有的是这样的......

private Texture2D WorkingTexture {get; set; }

private void Update()
{
 if(some input)
 {
  this.WorkingTexture = null;
 }

 if(some other input)
 {
  this.WorkingTexture = new Texture2D(this.GraphicsDevice, 500, 500, true, SurfaceFormat.Color);

  this.WorkingTexture.SetData<Color>(0, new Rectangle((int)vector2.X, (int)vector2.Y, 4, 4), colors, 0, 16);

  }
}

private void Draw()
{
 if (this.WorkingTexture != null)
 {
    spritebatch.draw(this.WorkingTexture,.....);
 } 
}

第二次编辑

我还设置了一个for循环,并在创建后手动将纹理的每个像素设置为一种颜色。这工作但它仍然显示像素我之前设置的颜色。这很奇怪。


请忽略此主题。我自己这样做的问题非常令人尴尬。我有一些代码可以缓存要更改的像素,是的......你猜对了,我没有清除它,而是在新的纹理实例上再次完成工作。

非常尴尬....

3 个答案:

答案 0 :(得分:1)

如果没有太多详细信息,听起来您正在尝试使用之前所做的更改来加载Texture2D。由于您将其设置为null,因此当您重新加载Texture2D时,它将返回到原始状态。如果要再次使用它,则需要保存对像素所做的更改以供日后使用。希望这有帮助!

答案 1 :(得分:1)

所以你设置了这样的纹理

Texture2D texture = Content.Load<Texture2D>("texture_name");

然后你应用一个新的引用

texture = Content.Load<Texture2D>("other_texture_name");

正确?

这不是它应该如何。您必须将GraphicsDevice设置为使用特定的纹理。使用BasicEffect类,这将是这样的:

BasicEffect effect = new BasicEffect(GraphicsDevice);
effect.Texture = texture;
effect.CurrentTechnique.Passes[0].Apply();

答案 2 :(得分:1)

如何创建纹理?如果从资源加载它们(texture = Content.Load(“texture_name”)),你描述的问题听起来像是你逻辑中的一个错误:你的程序没有做你认为它正在做的事情。跟踪,调试......

如果你正在创建全新的纹理(纹理=新的Texture2D(...)),则可能(未经验证)新纹理未初始化并且正在从某种内存池中检索其内存空间,因此检索最近标记的处理纹理数据。例如,尝试初始化纹理数据,并将其设置为全黑,