[英]When assigning value into an Array it returned Object reference not set to an instance of an object
[英]Assigning Color(Struct) object by reference instead of value
我在XNA中使用大量的顏色。 所有這些顏色都來自Theme類,其中包含當前主題的可能顏色。
這些顏色在SpriteBatch.Draw()中用作疊加層,並使用白色紋理(1.1 px)。
用戶可以選擇在運行時更改此主題,然后將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;
}
}
}
}
控件具有屬性Color,並且設置如下: control ctrl.Color = ThemeColor.FGreen
然后在控件類中: SpriteBatch.Draw(x,x,Color);
您可以在類中包含應用程序主題顏色,並在每次將結構傳遞到某個地方時訪問該結構的類副本。 當然,結構和顏色本身仍將是值類型,但是據我所知,重要的一點是訪問顏色的相同副本。
public static class ColourContainer
{
public static Color ThemeColour { get; }
public static void UpdateTheme(Color newColour)
{
// Update, etc.
}
}
然后將這些方法傳遞給方法的方式可能無法更改(除非代碼是您自己的),但是顏色的來源很重要。 只要您每次從容器中獲取容器並根據主題更改來更新容器,更改都會在整個系統中泛濫。
在您的控件中,以這種方式更改您的Color屬性...
class Control
{
public int UseThemeColor = -1;
public Color Color {
get { return (UseThemeColor==-1 ? _color : ThemeColor.GetByIndex(UseThemColor); }
set { _color = value; UseThemColor = -1; }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.