私は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);
私は少しそれを明確にするためにいくつかのコードを追加しました。コードは私のものです。ご覧のとおり、静的プロパティを使用することは実際にはオプションではありません。各オブジェクトに色が格納され、描画に使用されるか、ソリューションが間違っていますか? – Mortana
@Mortanaこんにちは、私のソリューションは本当に他のコードがあなたのものでない場合でした。これを機能させるには、各オブジェクトに色を保存するのではなく、代わりに共有リソースにアクセスします。したがって、これは、すべてのオブジェクトを保持しても、共有された更新が得られるようにしたい場合は、同じオブジェクトインスタンスを提供する必要がある場合、あなたがやることと同じです。あなたはクラスを使ってそれを達成することができます。 –