Zauberklasse
-
Guten Abend Community,
ich hätte eine Frage zur Verwaltung der Zauberklasse/n. Da jeder Zauber individuell ist, dachte ich mir, mach ich auch für jeden Zauber eine eigene Klasse.
Dabei ist Spell meine Oberklassenamespace RPG.Spell { public abstract class Spell { public int ID { get; private set; } public string Name { get; private set; } public string Description { get; private set; } public SpellElement Element { get; private set; } public SpellType Type { get; private set; } public SpellTarget Target { get; private set; } public int Level { get; private set; } public enum SpellElement { } public enum SpellType { } public enum SpellTarget { } protected Spell(...) { } } }
Das ist jetzt meine Oberklasse, die hier mal grob hinkopiert hab.
Nun habe ich schon einen Zauber implementiert, sieht so ausnamespace RPG.Spell.Spells { class Swordthrust : Spell { public int MinDamage { get; private set; } public int MaxDamage { get; private set; } public Swordthrust(/*Werte der Oberklasse + Min und MaxDamage*/) : base(/*Werte der Oberklasse*/) { } public bool Use(Interface.Player.IPlayerableCharacter attacker, Interface.Player.IPlayerableCharacter target) { } } }
Jeder Zauberkonstruktor ist anders, denn ein Heilzauber, oder ein "Bauezaubertrank" Zauber, hat ja kein MinDamage und MaxDamage. Außerdem würde auch jeder Zauber die Use Methode anders implementieren. Bei diesem Zauber handelt es sich um einen einfachen Schwerthieb vom Angreifer auf das Ziel, aber bei einem Umgebungszauber wäre die Umgebung ja kein IPlayerableCharacter.
Wenn das wirklich okay ist, so wie ich es mache (vielleicht geht es sogar nicht anders), hätte man am Ende aber ziemlich viele Klassen. World of Warcraft hat bestimmt auch an die ~400 Zauber, das würden 400 Klassen entsprechen, mag das nicht bisschen viel? Vorteil hätte das ganze natürlich schon, da man dynamisch bleibt. Ist das also okay so wie ich es mache, oder gibt es eine bessere Variante?Mit freundlichen Grüßen,
Freaky
-
Daher macht man sowas auch nicht durch Klassen getrennt. Sondern eine Klasse (ggf auch ein paar mehr) und Kapselst das so das man alle Zauber vom gleichen Typ in diese Klasse macht.
Beispiel:
Du hast
-Angriffszauber (Player vs Player [bzw Char was auch Mob oder NPC sein kann])
-Umgebungszauber(Player + irgendwas in der Landschaft)
-EffektZauber(nur Player)Dann gibts da die oberklasse "Zauber" von der alle dies Zaubertypen abgeleitet sind. Die speichert die dinge wie ID,Name etc.
Für dein Spiel baust du dir dann nur listen von solchen Zaubern auf, zusätzlich brauchst du eine Globale Bibliothek welche Zauber es gibt. Lernt z.B. ein Spieler so einen Zauber "Clonest" du dir den Zauber aus der Bibliothek in ein Zauberbuch. Zaubert so ein Char solch einen Zauber, wird er diesen aus den Zauberbuch ausführen (also die Kopie) du Schaust was für Zauber das ist (Umgebung,Effekt,Angriff...) Castest entsprechend und führst "DoSpell" o.Ä. aus.
Dabei passt mir aber aktuell das casting nicht. Ggf kriegt man das noch irgendwie weg.
Um speicher zu sparen könntest du manche Elemente in der Globalen Bibliothek lassen (Name, Description, Element etc. alles was sich für den Zauber im Zauberbuch auch nie ändert) und verweist bei deinen Lokalen Zaubern auf die ID in der Bilbiothek um dorther diese Daten zu laden. Das spart damit etwas speicherplatz.
-
Wenn man das alles in einer Klasse macht, wie macht man das dann mit den unterschiedlichen Verhalten der Zauber? Beispiel:
1. Angriffzauber für Nahkampf: Der Angreifer rennt zum Gegner und Wirbelt ihn herum.
2. Angriffzauber für Fernkampf: Der Angreifer schießt eine Schockwelle auf den Gegner.Bei beiden Zauber verhält der Angreifer sich ja verschieden. Bei dem einen rennt der Angreifer hin, bei dem anderen bleibt er stehen oder rennt vieleicht auf eine sichere Position. Außerdem müssen ja verschiedene Animationsequenzen abgespielt werden.
Ich habe mich auch schon immer gefragt wie man das am saubersten trennt.
Gruß, Daniel_S
-
Daniel_S schrieb:
Wenn man das alles in einer Klasse macht, wie macht man das dann mit den unterschiedlichen Verhalten der Zauber? Beispiel:
1. Angriffzauber für Nahkampf: Der Angreifer rennt zum Gegner und Wirbelt ihn herum.
2. Angriffzauber für Fernkampf: Der Angreifer schießt eine Schockwelle auf den Gegner.Bei beiden Zauber verhält der Angreifer sich ja verschieden. Bei dem einen rennt der Angreifer hin, bei dem anderen bleibt er stehen oder rennt vieleicht auf eine sichere Position. Außerdem müssen ja verschiedene Animationsequenzen abgespielt werden.
Ich habe mich auch schon immer gefragt wie man das am saubersten trennt.
Gruß, Daniel_S
Das macht die UseFunktion... die bekommt ja je nach Typ des Zaubers die beiden Charactere. Dort musst du nun das handling einbauen.
1.) Prüfen ob der Char beim Gegner ist, wenn nicht den Spieler in einen Zustand versetzen der sich den angriff merkt und den char auf den gegner zubewegt und dann ggf nochmal diesen Zauber aufruft. Wenn der Char sich genau vor dem Gegner befindet, wirble Gegner herum und mach schaden
2.) Prüfe entfernung, wenn man zu weit entfernt ist, Char in einen zustand versetzen der den Spieler in die richtung des Gegners versetzen und beim erreichen des Ziels den Zauber erneut ausführt.Du brauchst also für sowas Hilfsfunktionen. Einen Zauber würde ich nur dann korrekt ausführen lassen wenn man nah genug dran ist.
In den ersten versuchen reicht es ja wenn du noch eine Nachricht ausgibst "Du bist zu weit entfernt um dies zu tun". Dann muss sich der Spieler noch von hand in richtung Gegner bewegen. Dieses Automatisch hinlaufen kann man dann nachrüsten.
-
Ok, danke schön.