2012-03-28 43 views
1

我在XNA中使用了大量颜色。所有这些颜色来自一个主题类,其中包含当前主题的可能颜色。通过引用而不是值分配颜色(结构)对象

这些颜色用于SpriteBatch.Draw()作为覆盖,使用白色纹理(1,1 px)。

用户可以选择在运行时更改此主题,然后重新分配主题类的颜色。

但是,由于Color是一个结构体,我分配给它的所有内容都获取了此对象的新副本。

问题是如果我改变了原来的颜色,改变将不会被反映出来。 有什么办法可以通过参考来传递颜色?还是另一种解决方案

一些更多的信息:

我的主题类:

/// <summary> 
    /// Theme enumerator 
    /// </summary> 
    public enum Theme 
    { 
     Standard = 1, Blue, Dark 
    } 

    public class ThemeColor 
    { 

     //TODO: Refactor this out 
     private readonly SmartHome _gameRef; 

     public Color FBlue; 
     public Color FDarkGrey; 
     public Color FGreen; 
     public Color FLightBlue; 
     public Color FLightGrey; 
     public Color FOrange; 
     public Color FWhite; 

     public ThemeColor(SmartHome gameref) 
     { 
      Dal.Instance.Setting.OnChangedSetting += ChangedColor; 

      FBlue = new Color(0, 114, 186); 
      FDarkGrey = new Color(107, 108, 110); 
      FGreen = new Color(140, 189, 70); 
      FLightBlue = new Color(0, 179, 231); 
      FLightGrey = new Color(233, 233, 234); 
      FOrange = new Color(241, 142, 0); 
      FWhite = Color.White; 
     } 

     /// <summary> 
     /// Called if a setting is changed, checks if this setting is a theme setting, 
     /// if so, change the colors 
     /// </summary> 
     /// <param name="setting">Changed setting</param> 
     public void ChangedColor(Setting setting) 
     { 
      if (setting.Key == "Theme") 
      { 

       switch ((Theme)Int32.Parse(setting.Value)) 
       { 
        case Theme.Standard:  
         FBlue = new Color(0, 114, 186); 
         FDarkGrey = new Color(107, 108, 110); 
         FGreen = new Color(140, 189, 70); 
         FLightBlue = new Color(0, 179, 231); 
         FLightGrey = new Color(233, 233, 234); 
         FOrange = new Color(241, 142, 0); 
         FWhite = Color.White; 
         break; 
        case Theme.Blue: 
         FBlue = new Color(0, 114, 186); 
         FDarkGrey = new Color(107, 108, 110); 
         FGreen = new Color(0, 179, 231); 
         FLightBlue = new Color(241, 142, 0); 
         FLightGrey = new Color(233, 233, 234); 
         FOrange = new Color(140, 189, 70); 
         FWhite = Color.White; 
         break; 
        case Theme.Dark: 
         FBlue = new Color(233, 233, 234); 
         FDarkGrey = new Color(0, 179, 231); 
         FGreen = new Color(107, 108, 110); 
         FLightBlue = new Color(0, 114, 186); 
         FLightGrey = new Color(140, 189, 70); 
         FOrange = new Color(241, 142, 0); 
         FWhite = Color.White; 
         break; 
       } 
      } 
     } 
    } 

的控制有一个属性颜色,设置如下: 在控制类control ctrl.Color = ThemeColor.FGreen

然后: SpriteBatch.Draw(x,x,Color);

回答

1

您可以在应用程序中包含应用程序主题颜色并访问t他每次将它传递给某个地方时,他都会复制这个结构体的副本。当然,结构和颜色本身仍然是一个值类型,但重要的是访问颜色相同的副本,据我所知。

public static class ColourContainer 
{ 
    public static Color ThemeColour { get; } 

    public static void UpdateTheme(Color newColour) 
    { 
     // Update, etc. 
    } 
} 

如何将这些然后被传递到方法可能不能改变(除非该代码是你的),但颜色的来源是什么,是非常重要的。只要您每次从容器中获取它并更新主题更改容器,更改应该在整个系统中涟漪。

+0

我添加了一些代码,以澄清了一下。代码是我的。正如你所看到的,使用静态属性并不是一个真正的选择,因为颜色存储在每个对象中,然后用于绘制,或者我看到你的解决方案是错误的? – Mortana 2012-03-28 09:49:28

+0

@Mortana嗨,我的解决方案是真的,如果其他代码不是你的。为了使它起作用,您不会将颜色存储在每个对象上,而是访问共享资源。因此,如果您希望所有对象都保持自己的状态,但仍然可以获取共享更新,则此操作与您要执行的操作类似......需要提供同一个对象实例。你可以通过使用一个类来实现。 – 2012-03-28 09:54:24

0

在你的控制来更改颜色属性这样...

class Control 
{ 
    public int UseThemeColor = -1;  

    public Color Color { 
     get { return (UseThemeColor==-1 ? _color : ThemeColor.GetByIndex(UseThemColor); } 
     set { _color = value; UseThemColor = -1; } 
    } 
} 
相关问题