Contesto:
Sto facendo un progetto di apprendimento in XNA. Quello che vorrei essere in grado di fare è permettere al gioco di essere moddabile permettendo agli utenti di inserire valori arbitrari in un file di dati JSON che viene letto nel gioco. Il fatto è che voglio evitare hardcoding se possibile e farlo funzionare automaticamente per qualsiasi cosa l'utente lanci al motore.
Problema:
Non ho idea di come progettare le classi che possono ospitare questo tipo di comportamento, poiché la mia comprensione è che qualunque cosa carichi il JSON deve mapparlo a variabili esistenti sull'oggetto:
public class SomeGameEntity
{
public float Strength { get; set; }
public bool IsStrong { get; set; }
}
Ma quello che voglio è che il codice client sia in grado di fare qualcosa del tipo:
SomeGameEntity.Stats["Strength"] = 16;
SomeGameEntity.Stats["IsStrong"] = true;
La mia soluzione:
A titolo di considerazione, definirei solo alcuni tipi di dati validi, probabilmente float , bool e string (altri tipi, ad esempio XNA.Color
, dovrebbe probabilmente essere dedotto da una combinazione di oggetti fluttuanti RGB sull'oggetto.)
Quindi, ciò che ha senso è creare una classe come la seguente:
public class EntityStatComponent
{
private readonly Dictionary<string, float> _floatValues;
private readonly Dictionary<string, string> _stringValues;
private readonly Dictionary<string, bool> _boolValues;
public float GetValue(string name) { }
public void SetValue(string name, float value) { }
public string GetString(string name) { }
public void SetString(string name, string value) { }
public bool GetFlag(string name) { }
public void SetFlag(string name, bool value) { }
}
Ma questo sembra un approccio ambiguo, specialmente con tre dizionari per oggetto attivo . Probabilmente direi che ci sono meno di 250 oggetti sullo schermo alla volta (personaggi, proiettili, ecc.)
Sfortunatamente, non penso che la tipizzazione generica sia la strada da percorrere per questo, poiché per T, dovrebbe accettare un singolo tipo di dati nel dizionario. In alternativa, se permettessi di usare qualsiasi valore T tramite il metodo get / set, dovrei usare la roba if(someArg is float)
, che capisco essere disapprovata.
Sto trascurando qualcosa, o c'è un modo migliore per farlo?