Sollten Gegenstände in einem Rollenspiel fest codiert oder auf andere Weise geladen werden?

7

Sollten statische Waffen (dh Eisenschwert, Mithrilaxt) ihre eigenen (statischen) Klassen sein, die von so etwas ItemWeaponabgeleitet sind, das selbst von einer Standardklasse Itemmit ihren eigenen (geerbten) Methoden abgeleitet ist?

Oder sollte es möglicherweise nur eine Standardklasse geben Item, eine ItemWeaponKlasse, und dann ist jede Waffe nur eine ItemWeaponInstanz, die zu Beginn des Spiels geladen wurde?

Wenn ich diesen Ansatz machen würde, wo würde ich alle Gegenstände und Waffen ins Spiel laden? drin?

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 sie funktioniert nicht. nichts tun?

Baiomu
quelle

Antworten:

11

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 LoadItemsaufgerufene Funktion laden Init, aber denken Sie daran, sie zu trennen, da Sie möglicherweise auch LoadItemsvon 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",
        ...
    }
]
Ingenieur
quelle
Sagen wir für Widerstände / Schwächen, sollte es tatsächlich eine Reihe von Schwimmern sein, wobei der Index spezifische Widerstände ist, wie 0 Feuer, 1 Eis, 2 Blitz usw.
Baiomu
@baiomu Ein Array wäre ideal, ja. Wenn Sie dann #define FIRE 0oder public 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) {...}.
Ingenieur
1

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:

Item <- Equipment <- Armor
Item <- Equipment <- Weapon
Item <- Food
Item <- Medicine

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.

Dtor
quelle