2011-07-27 37 views
-1

我有一个奇怪的问题,我认为我对XNA框架的相对缺乏知识禁止我修复。XNA新的Texture2D保留旧数据

基本上我有一个Texture2D引用被设置为一个新的Texture2D实例。在运行期间,它的一些像素被设置,并且这一切都与其在游戏循环中的绘制非常吻合。

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

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

编辑

对不起,我清楚之前wasnt。

我所拥有的是这样的事情...

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循环和手动纹理的每个像素设置为颜色是后创建。这项工作仍然显示像素为我以前设置的颜色。这很奇怪。


请忽略此线程。这个问题非常令人尴尬,我自己也在做。我有一些缓冲了像素的代码被改变,是的...你猜对了,我没有清除它,它在新的纹理实例上重新开始工作。

很不好意思....

回答

1

而不必太多的细节去,这听起来像你想与您前面所做的更改加载的Texture2D。由于您将其设置为空,所以当您重新加载Texture2D时,它将回到原始状态。如果您想再次使用它,您需要将对像素所做的更改保存以备将来使用。希望这可以帮助!

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(); 
+0

嗨对不起,混淆,我更新了示例代码的问题。 – Nick

1

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

如果要创建全新的纹理(纹理=新的Texture2D(...))这是可能的(未验证),新的纹理没有初始化,它的内存空间正在从检索某种内存池,因此检索最近标记的处理纹理数据。例如,尝试在创建纹理数据后立即初始化纹理数据,将其设置为全黑。

+0

谢谢,是的,我尝试用一​​种颜色填充纹理,但它没有区别,就像你在那里有一个纹理时一样,无论什么时候我绘制该引用,它都会绘制,无论Texture2D的哪个实例挂钩了它。 – Nick