我在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