2012-03-28 13 views
1

私はXNAで多数の色を使用しています。これらの色はすべて、現在のテーマの可能な色を含むThemeクラスから来ています。値の代わりに参照によるカラー(構造)オブジェクトの割り当て

これらの色は、白色テクスチャ(1,1 px)を使用して、SpriteBatch.Draw()でオーバーレイとして使用されます。

ユーザーはこのテーマを実行時に変更することができます。その後、Themeクラスの色が再割り当てされます。

しかし、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

アプリテーマの色をクラスに入れてアクセスできます彼はあなたがどこかにそれを渡すたびにstructのクラスコピーを作成します。もちろん、構造体と色自体は値型のままですが、重要なビットは私が知る限りでは同じ色の色にアクセスしています。これらは、その後、(コードがあなたでない限り)そう変更することはできませんメソッドに渡されたが、色のソースが重要なものであるされている方法

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

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

。コンテナから毎回それを取得し、テーマ変更時にコンテナを更新する限り、変更はシステム全体に波及するはずです。

あなたのコントロールで
+0

私は少しそれを明確にするためにいくつかのコードを追加しました。コードは私のものです。ご覧のとおり、静的プロパティを使用することは実際にはオプションではありません。各オブジェクトに色が格納され、描画に使用されるか、ソリューションが間違っていますか? – Mortana

+0

@Mortanaこんにちは、私のソリューションは本当に他のコードがあなたのものでない場合でした。これを機能させるには、各オブジェクトに色を保存するのではなく、代わりに共有リソースにアクセスします。したがって、これは、すべてのオブジェクトを保持しても、共有された更新が得られるようにしたい場合は、同じオブジェクトインスタンスを提供する必要がある場合、あなたがやることと同じです。あなたはクラスを使ってそれを達成することができます。 –

0

あなたのColorプロパティは、この方法を変更...

class Control 
{ 
    public int UseThemeColor = -1;  

    public Color Color { 
     get { return (UseThemeColor==-1 ? _color : ThemeColor.GetByIndex(UseThemColor); } 
     set { _color = value; UseThemColor = -1; } 
    } 
} 
関連する問題