我在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);
我添加了一些代碼,以澄清了一下。代碼是我的。正如你所看到的,使用靜態屬性並不是一個真正的選擇,因爲顏色存儲在每個對象中,然後用於繪製,或者我看到你的解決方案是錯誤的? – Mortana 2012-03-28 09:49:28
@Mortana嗨,我的解決方案是真的,如果其他代碼不是你的。爲了使它起作用,您不會將顏色存儲在每個對象上,而是訪問共享資源。因此,如果您希望所有對象都保持自己的狀態,但仍然可以獲取共享更新,則此操作與您要執行的操作類似......需要提供同一個對象實例。你可以通過使用一個類來實現。 – 2012-03-28 09:54:24