Waffen sind Daten. Sie sollten Daten niemals wirklich fest codieren. Ihre Strukturen / Klassen sollten alle notwendigen Parameter enthalten, um die Daten einer Waffe von Grund auf neu zu erstellen, z.
struct Weapon
{
string name;
int damageMin;
int damageMax;
bool entangle;
bool canHitNoncorporeal;
float resistFire;
float resistElec;
float attackSpeed;
//etc. ad nauseam
}
Und dann sagen Sie in Text / .CSV:
Mithril Sword,15,30,false,true,0,10,4.5
Leather Whip,2,6,true,false,0,0,11
Und ja, Sie würden normalerweise über eine LoadItems
aufgerufene Funktion laden Init
, aber denken Sie daran, sie zu trennen, da Sie möglicherweise auch LoadItems
von einer anderen Stelle aus aufrufen müssen , z LoadGame
.
Wenn einige Waffen spezielle Eigenschaften haben, wie z. B. mehrere Angriffe oder einen anderen Effekt, wäre es vorteilhaft, sie zu den separaten Klassen zu machen, um sie so wie sie sind auszuführen, anstatt dass jede Waffe im Spiel diese Funktion hat, außer dies nicht irgendetwas tun?
Nee. Sie sollten dies als einzelne Klasse tun, da es sich letztendlich um eine begrenzte Anzahl von Optionen für alle Waffen in einem bestimmten Spiel handelt. Auf diese Weise können Sie die Eingabe von Gegenständen vereinfachen (Ausnahme könnte die Delegierung viel später sein; tun Sie dies vorerst als eine Klasse , später nach SRP ausrechnen ). Der andere Grund ist, dass der Umgang mit Kombinationen statischer Klassen aus Gründen, auf die ich hier nicht näher eingehen werde, schnell schwierig wird. Es ist wirklich nichts Falsches daran, ein paar zusätzliche Daten für Waffen zu speichern, dafür ist der CPU-Cache gedacht. Und im schlimmsten Fall können Sie Ihre Daten später jederzeit bitweise komprimieren.
Wenn Sie Optionen (Mitglieder) häufig ändern möchten, müssen Sie ein benanntes Format wie JSON / XML / YAML verwenden. Andernfalls müssen Sie sich Gedanken über die Änderung der Reihenfolge wie in der obigen CSV machen, die nicht erwähnt wird WAS jeder Eintrag ist, aber nur in der richtigen Reihenfolge liefert (dies ist sicherer):
[
{
"name": "Mithril Sword",
"damageMin": 15,
"damageMax": 30,
"entangle": false,
...
},
{
"name": "Leather Whip",
...
}
]
#define FIRE 0
oderpublic const int FIRE = 0;
so weiter für die verschiedenen Elemente / Widerstände verwenden, können Sie sie einfach aus dem Array in Code wie folgt referenzieren :if (resistances[FIRE]) > 20.0f) {...}
.Zum größten Teil hängt es wirklich von Ihren persönlichen Vorlieben ab und davon, wie Sie es sehen. Persönlich würde ich es als Gegenstand betrachten, der die oberste Basisklasse ist, und als Waffe, die es erweitert. Vielleicht mit Ausrüstung dazwischen, so etwas wie:
Dann hätte ich Konfigurationsdateien, die alle Waffen und ihre gemeinsamen Teile wie Schaden, Angriffsgeschwindigkeit, vielleicht Ausdauer angeben.
Wenn Sie etwas wirklich Einzigartiges haben, können Sie eine Klasse in Betracht ziehen, die von der Waffe erbt, oder Sie können sie einfach als Feld in den Konfigurationsdateien als wahr / falsch angeben, unabhängig davon, ob jede Waffe über diese Fähigkeit verfügt oder nicht.
Ich würde mich von jeder Waffe fernhalten, die ihre eigene Klasse hat. Wenn Sie das tun würden, gäbe es eine Menge duplizierten Codes oder eine Menge Klassen, die alles erben und keinen echten Code enthalten.
quelle