Du bist nicht angemeldet.

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

1

12.05.2006, 09:13

Eine Random Klasse erzeugen

Hallo,

also mch würd mal ne einfache variante für random klassen kreierung interessieren :)

da ich mir ziemlich sicher bin,dass es da nen einfacheren weg gibt als

C-/C++-Quelltext

1
2
3
4
5
int i_WhichClass = rand()%100;
if ( i_WhichClass == 1)
   pClass = new CClass1();
if ( i_WhichClass == 2)
   pClass = new CClass2();

, wollte ich mal fragen, wie ihr sowas macht.

mir wär die idee mit nem megakonstruktor gekommen mit parameter, der z.b. in meinem fall, das level eines monsters erwartet (also einen integer wert) und je nach der übergebenen zahl, wird dann ein monster der jeweiligen stufe kreiert.

Problem: wenn es mehrere monster der gleichen stufe gibt, musste ich wieder zur oberen variante zugreifen.
Problem2: der Konstruktor ist abartig lang, und das schon bei 20 Monsterklassen :)

Gibts also so ne Möglichkeit wie:

C-/C++-Quelltext

1
pClass = new CMainclass:RandomCGeerbteKlasse();

?

Oder ob ihr eine Variante habt, die einfacher ist, als ein Megakonstruktor mit Parameter :)

mfg
Drac

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.05.2006, 11:10

spontan pseudo code^^:

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
typedef IMonster* (*MONSTER_CREATEPROC)();
.
.
.
int InitMonsters()
{
    MonsterFactory.RegisterMonsterClass( "orc", &CreateOrc );
    MonsterFactory.RegisterMonsterClass( "gargoyle", &CreateGargoyle );
}
.
.
.


IMonster* MonsterFactory::SpawnRandom()
{
    MONSTER_CREATEPROC create = classList[rand() % classList.getCount()];

    if( create )
        return create();
    else
        return 0;   

}

IMonster* MonsterFactory::SpawnMonster( const char* className )
{
    MONSTER_CREATEPROC create = classList[className];

    if( create )
        return create();
    else
        return 0;
}



IMonster* CreateOrc()
{
    return new orc;
}

IMonster* CreateGargoyle()
{
    return new gargoyle;
}
.
.
.


alle monster sind von IMonster abgeleitet.
solch ein system sollte um beliebige monster erweiterbar sein (z.b. über plug ins ;) )...

ansonsten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
switch( rand() % 100 )
{
    case 1:
        pClass = new pClass1;
        break;
    case 2:
        pClass = new pClass2
        break;
    .
    .
    .
}


:P

3

12.05.2006, 14:32

hmmm... danke mal für den vroschlag :D aber ich dachte da eher so an

C-/C++-Quelltext

1
Create Random Level 5 Monster


sowas in der art :)

aber deine variante geht ja auch halbwegs gut :)


würd mich mal interessieren, wie das z.b. blizzard gemacht hat :)

mfg
Drac

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

4

12.05.2006, 19:17

ich denk mal die erstellen normale lvl 1 Helden,
und adden mit Prozenten eben Stats dazu :P

5

12.05.2006, 20:07

@babefish:

ne das mein ich ned :)

man kann z.b. bei deren editor einstellen.

create x random level 6 units

z.b.

glaub irgendwie nicht,dass das so kompliziert ist :D bzw. dass sich blizzard die mühe angetan hat, das so zu programmieren, wie hier bs jetzt die ideen waren :D

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

6

12.05.2006, 20:55

ich würde einfach der factory den level übergeben. die soll dann intern einfach mit diesem level auf die jeweiligen eigenschaften, die natürlich per vererbung standartisiert sein müssen anhand des levels prozentuale steigerungen drauf hauen... und schon hast du ne gute methode. das mit dem random ist auch nicht so schwierig. wenn du die monster-klassen in nem std::vector aufbewahrst, kannst du auch mit dem '[]' operator darauf zu greifen. dann baust du der factory einfach ne methode ein, die n zufällige monster erzeugt...

gibt natürlich auch noch tausend andere wege. aber ich steh auf solche factory patterns ;)
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

7

13.05.2006, 15:39

hm nochwas:

gibts vl ne funktion wie enum, die konstruktoren abspeichern kann?

weil dann würds noch einfacher gehen :)

enum EMonster
{
Gargolye = 1
Golem = 2
};

gMonsters = EMonster[rand()%50)


ich weiß, ich weiß,dass das ned geht mit enum.

aber kann man irgendwie ein "funktionsarray" machen?

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

8

13.05.2006, 17:22

du kannst von allem arrays anlegen. ist nur die frage obs was nutzt...

so kannst du das mit dem array machen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// erstmal den funktionstyp festlegen (für die pointer später)

typedef (CMonster*) (*CREATEMONSTERFUNC) (unsigned int);

// die tatsächlichen funktionen

CMonster* CreateGargoyle(unsigned int uiLevel);
CMonster* CreateGolem(unsigned int uiLevel);

// zur besseren nutzung mit nem enum auf die funktionen zugreifen

enum EMonster {Gargoyle=0, Golem};
// und die anzahl der verfügbaren monster für den random

const unsigned int uiNumMonsters=2;

// Der array, der die funktionen speicher

CREATEMONSTERFUNC functions[uiNumMonsters];
functions[Gargoyle] = CreateGargoyle;
functions[Golem] = CreateGolem;

und so erschaffst du dann dein zufälliges monster

C-/C++-Quelltext

1
2
3
4
5
6
7
// die funktion zum erzeugen eines monsters

CMonster* CreateRandomMonster(unsigned int uiLevel)
{
    unsigned int uiMonsterType = rand()%uiNumMonsters;
    
    return functions[uiMonsterType] (uiLevel);
}

so geht das...

ist allerdings ne eher vereinfachte darstellung ;) aber ich will dir ja auch nicht alles verraten ...
sowas wie den array und die CreateRandomMonster() kannst du prima in ne MonsterFactory Klasse einbauen und die Monster musst du bei diesem Beispiel alle von CMonster erben. die kann mann dann auch gleich schön in nem LevelManager oder sowas alle speichern und verwalten.
so als anreiz

ich hoffe das mit den funktionspointer klappt so, ich hab das länger nicht mehr benutzt
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Werbeanzeige