如何更改已经加载的内容的纹理?
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);
我在我的游戏中得到了一个菜单,按钮达到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);