Im Wesentlichen, was Aron_dc sagte, obwohl ich noch weiter gehen würde. Im Allgemeinen sollten Sie versuchen, Ihre Klassenstruktur so flach wie möglich zu halten und Code (Algorithmen) von Daten (Attributen) zu trennen.
Sie benötigen nur eine Waffenklasse für Nahkampf- / Sofortschlagwaffen. Diese Klasse kann entweder sofort überprüfen, was sie getroffen hat, oder sie erhält ein Objekt, dem sie Schaden zufügen kann. Dies schließt Fernkampfwaffen ein, die wie ein Laser sofort getroffen werden (eine Waffe könnte es auch sein, wenn Sie sie nicht zu realistisch modellieren möchten).
class InstantWeapon{
Sprite sprite; //should be inherited from EquippableObject, or DrawableGameObject, or something
WeaponType weaponType;
DamageType dmgType;
Double dmgOnHit;
...
void Hit(ObjectWithHitPoints o){...}
void Hit(Ray hitRay)
}
Eine zweite Klasse wird für Partikellaichwaffen verwendet, beispielsweise für einen Feuerballstab. Diese Waffen beschädigen nicht direkt, sondern erzeugen ein neues Objekt, das sich nach seiner eigenen Logik bewegt und Schaden verursacht, wenn es mit einem Objekt kollidiert. In diesem Fall enthält das Partikel alle erforderlichen Informationen (Schadensmenge und -typ, Radius usw.) und es ist einfach, ihnen eine benutzerdefinierte Logik zu geben (Zielsuchrakete oder Verlust von Schaden, je länger es sich bewegt, ...).
class ParticleSpawner{
InteractiveParticle sampleParticle;
void Fire(Vector3 position, Vector3 direction){
ParticleEngine.Add(sampleParticle.Clone());
}
}
Je nachdem, wie komplex Ihre Waffe und Ihr Schadenssystem sein sollen, können Sie sich das Komponentenmuster ansehen . Das Grundprinzip ist, dass Sie eine Weapon
Klasse und eine Liste mit mehreren Instanzen der DamageComponent
Klasse haben würden. Die DamageComponent
Klasse enthält den Algorithmus und die Daten für alle Waffeneffekte, die für diese eine Waffe gelten.
class Weapon{
List<DamageComponent> damageComponents;
void Fire(Ray hitRay){
foreach(component : DamageComponent)
component.Apply(hitRay);
}
}
Jede Komponente kann jetzt einen Feuerball erzeugen, feindliche Rüstungen reduzieren, Standardschaden verursachen, einen "Feuer" -Effekt auf Ziele anwenden usw. Zusätzlich kann jede Komponente den Waffenschwung so handhaben, wie sie will. Holen Sie sich nur das Ziel direkt vor oder spalten Sie in einem weiten Bogen, etc ...
Beachten Sie auch, dass das Komponentensystem an anderen Stellen nützlich sein kann.
- Verschiedene Arten von Rüstungskomponenten schützen unterschiedlich vor verschiedenen Schadensarten
- Partikel auf Update-Komponenten können ein einzelnes Partikel auf unterschiedliche Weise beeinflussen
- Fähigkeiten, die durch Fertigkeiten oder Objekte gewährt werden, müssen nur einmal implementiert werden, da sie dem Spieler einfach die Can-Fly- oder die Can-See-Underground-Komponente hinzufügen.
Im Allgemeinen können Sie viele kleine Komponenten erstellen, die für sich genommen nicht viel bewirken, aber äußerst komplexe Systeme bilden können, da ihre Kombinationen mit jeder neuen Implementierung exponentiell zunehmen.
Die daraus resultierenden Effekte des Systems können sehr komplex werden, was sehr schön ist, wenn Sie ein aufstrebendes Verhalten wünschen und Dinge auf komplexe Weise modellieren möchten. Dies macht es jedoch schwieriger, Dinge wie Waffenbalance oder feindliche Schwierigkeiten zu tun. Ein beliebtes Beispiel ist Diablo3 mit seinen zufälligen Fähigkeitskomponenten. Bestimmte Kombinationen sind viel stärker als die anderen.