Du bist nicht angemeldet.

Werbeanzeige

1

04.04.2010, 15:21

Spieler soll zwischen verschiedenen Klassen wählen können - Umsetzung?

Hallo,

Ich habe wieder ein kleines Problem... und zwar möchte ich, dass der Spieler zwischen drei verschiedenen Klassen wählen kann.

Basisklasse:
CEinheit


abgeleitete Klassen:
CKrieger
CMagier
CBogenschütze


Wie kriege ich es jetzt hin, dass ich einen Spieler habe, der zur Laufzeit seine Klasse aussucht und mit dieser dann das ganze Spiel über spielen kann? Ich hab an eine Klasse CSpieler gedacht, die über eine Funktion GetClass oder so ihre Klasse annimmt, allerdings weiß ich nicht was ich für einen Parameter nehmen soll. Wie würdet ihr das lösen?


Mit diesem Ansatz kann ich ja nur auf die Funktionen von CEinheit zugreifen, ich möchte aber ja, dass die Klassen Memberfunktionen haben, die die anderen Charaktere nicht haben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
 class CEinheit 
{ 
}; 

class CRitter : public CEinheit 
{ 
}; 

int main () 
{ 
CEinheit* Spieler = new CRitter; 
} 

2

04.04.2010, 15:28

Also wenn Charaktere eigene Funktionen haben sollen, dann musst du diese einfach in der abgeleiteten Klasse definieren. Du kannst dir auch mal das Schlüsselwort virtual angucken.
http://tutorial.schornboeck.net/virtual.htm
Dass der Spieler dann das ganze Spiel über diesen Charakter hat, musst du halt abspeichern und dann beim Spielstand laden mitladen und entsprechend initialisieren.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

04.04.2010, 15:58

das find ich in der erklärung nicht gut:

C-/C++-Quelltext

1
2
3
    void flieg(); //hier muss kein virtual stehen, denn flieg()
                    //wurde schon in Vogel als virtual deklariert
                    //und das virtual kann sich nicht auflösen

da sollte man trotzdem virtual vor schreiben.

vererbung ist ein sehr komplexes thema bei dem man viel falsch machen kann.
am besten du liest in deinem nachschlagewerk nach.

die ID der klassen kannst du in einem enum speichern. in dem fall ist es ratsam jeder klasse eine feste ID zu geben die sich niemals ändern wird. es kann ja sein, dass du neue klassen erstellst und die alten aber weiterhin aus den alten datein laden willst.

C-/C++-Quelltext

1
2
3
4
5
6
enum Einheiten
{
Krieger = 0,
Magier = 1,
Bogenschütze = 2
}
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

4

04.04.2010, 16:03

Okay, aber ich muss bzw. sollte doch auch eine Klasse CSpieler erstellen und über die wähle ich ja dann meine Klasse aus. Macht man das über eine Memberfunktion der Klasse CSpieler? Sollte CSpieler von irgendwas erben, oder jemand von CSpieler erben? Das ist mir nicht ganz klar wie ich das Spieleprogrammier-design technisch verbinden soll.

Am liebsten wäre mir mal ein kleines Beispiel, wo man das gut erkennen kann, auch wie man das mit den ID's handelt. Hast du da vielleicht ein altes Beispiel oder sowas in der Art?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Proggi« (04.04.2010, 16:14)


NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

04.04.2010, 16:17

bei mir verwaltet die spielerklasse ne ganze menge. zum beispiel punktestand, aktuelles level, inventar usw.
das ist ja unabhängig von der spielerklasse(der art des charakters).
deswegen enthält meine spielerklasse von einer instanz einer klasse die von einer anderen klasse erbt mit der ich auch gegnereinheiten erstelle.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Fred

Supermoderator

Beiträge: 2 130

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.04.2010, 18:08

Also ich persönlich würde Vererbung bevorzugen, weil es ordentlicher ist, wenn alle Funktionen, die zu einem Krieger gehören in einer Klasse zu finden sind und alle Magierfunktionen in einer anderen.

Du könntest aber natürlich auch einfach mit den enums alles in eine Klasse packen und eben mit mehreren If-Abfragen prüfen, ob eine bestimmte Aktion möglich ist. Ist zwar keine Schöne Art, aber sie lässt sich einfach realisieren.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

7

04.04.2010, 21:17

Man bekommt oft ein flexibleres Design wenn man eine Hat-Beziehung nutzt, statt etwas in eine Ist-Beziehung zu quetschen.

Als Beispiel nehmen wir an das sich Krieger und Magier im Bezug auf den Angriff unterscheiden. Statt zu erben bleiben wir bei der Klasse Spieler und fügen einen Zeiger vom Typ Angriff hinzu. Angriff ist eine Klasse, von der zwei andere Klassen erben: SchwertHieb und FeuerBall. Wählt der Spieler nun eine Klasse aus, so bekommt er entsprechend SchwertHieb oder Feuerball als Angriff.

Das schöne dabei ist, dass man das System beliebig weiterführen kann und dabei die Erweiterbarkeit behält um unzählige Kombinationen zu erstellen. Nennt sich übrigens Composing oder Composition Pattern.

Nox

Supermoderator

Beiträge: 5 271

Beruf: Student

  • Private Nachricht senden

8

05.04.2010, 10:30

Als ich davon las dachte ich eher an policy-based design. Aber man kann ja mal einfach alle pattern anschauen um festzustellen welches am besten passt :) .
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

9

05.04.2010, 16:22

Zitat

Wählt der Spieler nun eine Klasse aus, so bekommt er entsprechend SchwertHieb oder Feuerball als Angriff.
Kann mir das vielleicht mal Jemand an einem kleinen Code-Beispiel demonstrieren? Finde die Methode ganz gut, erinnert mich an "Gothic", da kann der Spieler Ja auch viele verschiedene Fähigkeiten erlernen. Soll dieser Zeiger CAngriff *pAngriff in der Klasse CSpieler dann immer auf die Attacke zeigen die man gerade ausführt? Wie funktioniert das wenn ich, sagen wir, 10 verschiedene Skills habe die der Spieler erlernt hat, wie soll ich das mit diesem pattern dem Spieler zuordnen?

Oder würde das ganze in etwa so ablaufen?

Ein Spieler hat 5 Attacken erlernt die über die Tasten 1, 2, 3, 4 und 5 jeweils benutzt werden können. Drückt der Spieler die 1, zeigt der Zeiger pAngriff auf Attacke 1 etc.

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

05.04.2010, 16:27

dann kann man std::vector nutzen und jeden skill rein schieben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige