C# 如何更改已加载内容的纹理?

C# 如何更改已加载内容的纹理?,c#,xna,C#,Xna,我在我的游戏中有一个菜单,上面有按钮来选择关卡,除了第一关卡按钮,其他所有按钮都使用灰色纹理,因为它们是“锁定”的。例如,当你击败关卡1时,它会返回关卡选择菜单,关卡2被解锁,但我希望它在解锁时使用不同的纹理,因此我尝试将其添加到主游戏类的更新方法中,但它仍然使用灰色纹理: if (level2.Unlocked == true) { level2Button = Content.Load<Texture2D&

我在我的游戏中有一个菜单,上面有按钮来选择关卡,除了第一关卡按钮,其他所有按钮都使用灰色纹理,因为它们是“锁定”的。例如,当你击败关卡1时,它会返回关卡选择菜单,关卡2被解锁,但我希望它在解锁时使用不同的纹理,因此我尝试将其添加到主游戏类的更新方法中,但它仍然使用灰色纹理:

            if (level2.Unlocked == true)
            {
                level2Button = Content.Load<Texture2D>("GUI\\level2");
            }
            level2Button.Update(gameTime);
if(level2.Unlocked==true)
{
level2Button=Content.Load(“GUI\\level2”);
}
level2Button.Update(游戏时间);

你必须有2个纹理,并在“绘制”阶段选择合适的纹理。没有其他选项。

您必须有2个纹理,并在“绘制”阶段选择适当的纹理。没有其他选项。

我真的建议您不要在更新方法中加载它,这不是一个好的做法。副作用会产生帧速率下降(滞后)和其他不必要的行为。因此,我的建议是将其加载到LoadContent方法中:

所以这是一种方法。我会使用更干净、更智能的工具,如
字典
列表
,其中级别包含纹理属性和IsLocked字段,每个索引表示级别的编号,如:

class Level {
   public Texture2D Texture {
      get {
         if( IsLocked )
            return lockedTexture;

         return unlockedTexture;
      }   
   }

   public bool IsLocked = true;
   private Texture2D lockedTexture, unlockedTexture;

   public LoadContent( ContentManager content, string lockedPath, string unlockedPath ){
       lockedTexture = content.Load<Texture2D>( lockedPath );
       unlockedTexture = content.Load<Texture2D>( unlockedPath );
   }
}
类级别{
公共纹理2D纹理{
得到{
如果(已锁定)
返回锁定结构;
返回未锁定的文本;
}   
}
public bool IsLocked=true;
私有纹理2D锁定纹理,解锁纹理;
公共加载内容(ContentManager内容、字符串锁定路径、字符串解锁路径){
lockedTexture=content.Load(lockedPath);
unlockedTexture=content.Load(unlockedPath);
}
}

我真的建议您不要在update方法中加载它,这不是一个好的做法。副作用会产生帧速率下降(滞后)和其他不必要的行为。因此,我的建议是将其加载到LoadContent方法中:

所以这是一种方法。我会使用更干净、更智能的工具,如
字典
列表
,其中级别包含纹理属性和IsLocked字段,每个索引表示级别的编号,如:

class Level {
   public Texture2D Texture {
      get {
         if( IsLocked )
            return lockedTexture;

         return unlockedTexture;
      }   
   }

   public bool IsLocked = true;
   private Texture2D lockedTexture, unlockedTexture;

   public LoadContent( ContentManager content, string lockedPath, string unlockedPath ){
       lockedTexture = content.Load<Texture2D>( lockedPath );
       unlockedTexture = content.Load<Texture2D>( unlockedPath );
   }
}
类级别{
公共纹理2D纹理{
得到{
如果(已锁定)
返回锁定结构;
返回未锁定的文本;
}   
}
public bool IsLocked=true;
私有纹理2D锁定纹理,解锁纹理;
公共加载内容(ContentManager内容、字符串锁定路径、字符串解锁路径){
lockedTexture=content.Load(lockedPath);
unlockedTexture=content.Load(unlockedPath);
}
}

谢谢Fuex和roxik0,我使用了这两个建议来解决这个问题。我创建了两个纹理变量,并在button类中添加了一个更新纹理的方法:

    public void UpdateTexture(Texture2D texture)
    {
        this.texture = texture;
    }
 if (level2.Unlocked)
                {
                    level2button.UpdateTexture(level2buttonNormal);
                }
level2button.Draw(spriteBatch);
这样,在绘制按钮之前,它会检查标高是否已解锁,并将其更新为使用正确的纹理:

    public void UpdateTexture(Texture2D texture)
    {
        this.texture = texture;
    }
 if (level2.Unlocked)
                {
                    level2button.UpdateTexture(level2buttonNormal);
                }
level2button.Draw(spriteBatch);

感谢Fuex和roxik0,我使用了这两个建议来解决它。我创建了两个纹理变量,并在button类中添加了一个更新纹理的方法:

    public void UpdateTexture(Texture2D texture)
    {
        this.texture = texture;
    }
 if (level2.Unlocked)
                {
                    level2button.UpdateTexture(level2buttonNormal);
                }
level2button.Draw(spriteBatch);
这样,在绘制按钮之前,它会检查标高是否已解锁,并将其更新为使用正确的纹理:

    public void UpdateTexture(Texture2D texture)
    {
        this.texture = texture;
    }
 if (level2.Unlocked)
                {
                    level2button.UpdateTexture(level2buttonNormal);
                }
level2button.Draw(spriteBatch);

你们有关于钮扣的课程吗?它是否具有表示应使用哪个纹理的属性?什么是level2Button?正如Feux在下面的精细回答,在绘制循环期间创建或更新新纹理的速度很慢,因为数据必须从CPU传输到GPU。与访问GPU上已上载/创建的数据相比,CPU到GPU内存总线的速度较慢。Offtopic,但我能想到的唯一一次在游戏循环中更新纹理的方法是使用渲染目标,但无论如何,这一切都发生在GPU上。你的按钮有一个类吗?它是否具有表示应使用哪个纹理的属性?什么是level2Button?正如Feux在下面的精细回答,在绘制循环期间创建或更新新纹理的速度很慢,因为数据必须从CPU传输到GPU。与访问GPU上已上载/创建的数据相比,CPU到GPU内存总线的速度较慢。离题但我能想到的唯一一次在游戏循环中更新纹理的方法是使用渲染目标,但所有的事情都发生在GPU上。真的有必要发布这个合并的答案吗?真的有必要发布这个合并的答案吗?这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。我的回答提供了解决方案:2纹理和在绘图阶段选择。这并不能提供问题的答案。若要评论或要求作者澄清,请在他们的帖子下方留下评论。我的回答提供了解决方案:2个纹理和在绘图阶段选择。