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

时间:2015-01-23 14:42:34

标签: c# xna

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

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

3 个答案:

答案 0 :(得分:3)

你必须拥有2个纹理并选择适当的&#34;绘制&#34;阶段。没有其他选择。

答案 1 :(得分:3)

我真的建议你不要在更新方法中加载它,这不是一个好习惯。副作用可能会产生帧速率下降(滞后)和其他不需要的行为。所以我的建议是在 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 );
   }
}

答案 2 :(得分:0)

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

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

这样在它绘制按钮之前它会检查关卡是否已解锁并更新它以使用正确的纹理:

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