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

How to change the texture of a content that has been loaded already?

我在我的游戏中得到了一个菜单,按钮达到select级别,除了第一级按钮外,所有其他按钮都使用灰色纹理,因为它们是"locked"。因此,例如,当您击败 1 级时,它 returns 进入 select 级菜单并且 2 级被解锁,但我希望它在解锁时使用不同的纹理,所以我尝试在主游戏 class 的更新方法中添加它,但它仍然使用灰色纹理:

            if (level2.Unlocked == true)
            {
                level2Button = Content.Load<Texture2D>("GUI\level2");
            }
            level2Button.Update(gameTime);

你必须有 2 个纹理和 select 在 "draw" 舞台上。没有其他选择。

我真的建议你不要在更新方法中加载它,这不是一个好习惯。副作用会导致帧速率下降(滞后)和其他不需要的行为。所以我的建议是在 LoadContent 方法中加载它:

protected override void LoadContent( ) {
    spriteBatch = new SpriteBatch(GraphicsDevice);

    //...
    level2ButtonUnlocked = Content.Load<Texture2D>("GUI\level2");
}

然后在Update方法中赋值:

protected override void Update( GameTime gameTime ) {
    if (level2.Unlocked == true){
        level2Button = level2ButtonUnlocked; 
    }
}

这就是其中一种方法。我会使用更干净、更智能的,例如 Dictionary<string, Texture2D>List<Level>,其中 Level 包含 Texture 属性 和一个 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 );
   }
}

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

    public void UpdateTexture(Texture2D texture)
    {
        this.texture = texture;
    }

通过这种方式,在绘制按钮之前,它会检查关卡是否解锁并更新它以使用正确的纹理:

 if (level2.Unlocked)
                {
                    level2button.UpdateTexture(level2buttonNormal);
                }
level2button.Draw(spriteBatch);