Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
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 .
Kann mir das vielleicht mal Jemand an einem kleinen Code-Beispiel demonstrieren?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include <iostream> #include <vector> using namespace std; class Skill // Basisklasse, nicht abstrakt, weil ich Instanz von ihr brauche { public: virtual void Angriff() {cout << "Skill!!!" << endl;} }; class Feuerball : public Skill { public: void Angriff() {cout << "Flammmmme!!!" << endl;} }; class Schwerthieb : public Skill { public: void Angriff() {cout << "Schwerthieb!!!" << endl;} }; class Eisnova : public Skill { public: void Angriff() {cout << "Eisnova!!!" << endl;} }; class Spieler { public: Skill *pSkill; vector<Skill*> Skills; // Hier werden die Skills reingeschoben int ID; // Über die ID werden Die Skills aufgerufen void UseSkill( int ID ) { pSkill = new Skill; pSkill = Skills[ID]; pSkill->Angriff(); } }; int main() { Feuerball *pFeuerball = NULL; // Wohin mit den ganzen Skills? pFeuerball = new Feuerball; // Schwerthieb *pSchwerthieb = NULL; // pSchwerthieb = new Schwerthieb; // Eisnova *pEisnova = NULL; // pEisnova = new Eisnova; // Spieler *pSpieler; // pSpieler = new Spieler; // pSpieler->Skills.push_back( pFeuerball ); pSpieler->Skills.push_back( pSchwerthieb ); pSpieler->Skills.push_back( pEisnova ); cin >> pSpieler->ID; pSpieler->UseSkill( pSpieler->ID ); // Skill einsetzen system("PAUSE"); return 0; } |
Ich möchte aber ja nicht zu Beginn dem Spieler alle Skills reinhauen, er hat am Anfang ja vielleicht nur einen und später 10. Deswegen habe ich in meiner Klasse nicht Instanzen der Skills gepackt, sondern nur die Instanz von Skills. Dann sollte ich wohl auf jeden Fall einen Skillmanager benutzen wenn ich nicht direkt über eine Instanz von Skill auf die Skills zugreifen möchte, oder?Zitat
Das einfachste wäre wohl auf die Wiederverwendung zu verzichten und jeder Spieler bzw. jede Einheit bekommt eine neue Instanz dieses Skills.
Nehmen wir an ich habe 50 Skills (im gesamten Spiel, nicht ein einzelner Spieler), würde ich die dann bei diesem SkillManager in eine Init() Funktion packen und zu Beginn des Spiels werden die alle in eine Liste geschoben? Ich muss noch bevor das Spiel startet für alle Skills mit new Speicher anfordern, oder?Zitat
Dieser kann dann eine Liste der Skills halten und das gesamte Skillsystem verwalten.
C-/C++-Quelltext |
|
1 2 |
Feuerball *pFeuerball = NULL; pFeuerball = new Feuerball; |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Proggi« (07.04.2010, 00:11)
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
// Die Funktion levelUp wird immer aufgerufen wenn der Spieler ein Level aufsteigt void levelUp(int level) { if(level == 10) { pSpieler->Skills.push_back( new Feuerball() ); // Erstellt den Feuerball und fügt ihn in die Skillliste wenn der Spieler Level 10 erreicht. } } |
C-/C++-Quelltext |
|
1 |
pFeuerball = new Feuerball; |
Alter Hase
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
class SkillManager { public: Skill *pSkill; vector<Skill*> Skills; // Hier werden die Skills reingeschoben void UseSkill( int ID ) { pSkill = new Skill; pSkill = Skills[ID]; pSkill->Angriff(); } void levelUp(int level) { if(level == 10) { Skills.push_back( new Feuerball() ); // Erstellt den Feuerball und fügt ihn in die Skillliste wenn der Spieler Level 10 erreicht. } if(level == 20) { Skills.push_back( new Schwerthieb() ); Skills.push_back( new Eisnova() ); } } }; class Spieler { public: SkillManager *pSkillManager; }; int main () { pSpieler->pSkillManager->levelUp( 20 ); // Das sieht komisch aus { |
Werbeanzeige