2012-03-28 85 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; } 
    } 
} 
相關問題