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

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

1

16.02.2006, 19:34

Nicht definierte Klasse benutzen

Hi! Ich versuche mich gerade an einer mini-Engine, die keinerlei Grafikunterstützung hat. Ich hab mir das so vorgestellt: Die Engine benutzt jedes Mal, wenn ein Objekt gerendert werden soll, eine Klasse, deren Funktionen leer sind. Der Endnutzer soll dann diese Klasse selber ausfüllen und eine Grafikengine seiner Wahl einbauen. Das Problem dabei ist, dass ich die Engine später als dll bzw lib haben möchte (hab sowas allerdings noch nicht gemacht, ich progg einfach mal drauf los) und der Benutzer soll nicht jedesmal wenn er was der Grafikklasse ändern will die Engine neu kompilieren müssen. Gleichzeitig kann die Klasse aber auch nicht außerhalb der Engine deklariert werden, weil ja die Funktionsaufrufe bekannt sein müssen. Die Klasse sieht in etwa so aus:

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
//Deklaration

    class AnimatedModel
    {
    private:

    protected:

    public:
        AnimatedModel(void);
        AnimatedModel(wchar_t* FileName);
        ~AnimatedModel(void);

        Result Move(float SecsPassed);
        Result Move(float SecsPassed, std::vector<float>);
        Result Render(float SecsPassed);

        Result StartAnimation(const wchar_t* Code);
        Result StopAnimation(void);
    }

//Definition

sd3de::AnimatedModel::AnimatedModel(void)
{

}

sd3de::AnimatedModel::AnimatedModel(wchar_t *FileName)
{

}

sd3de::AnimatedModel::~AnimatedModel(void)
{

}

Result sd3de::AnimatedModel::Move(float SecsPassed)
{
    return RET_OK;
}

Result sd3de::AnimatedModel::Move(float SecsPassed, std::vector<float>)
{
    return RET_OK;
}

Result sd3de::AnimatedModel::Render(float SecsPassed)
{
    return RET_OK;
}

Result sd3de::AnimatedModel::StartAnimation(const wchar_t *Code)
{
    return RET_OK;
}

Result sd3de::AnimatedModel::StopAnimation(void)
{
    return RET_OK;
}


Also das ist erstmal so mein Ansatz... Gibt es irgendwie die Möglichkeit, dass der Benutzer die Klasse erweitern kann, ohne dass die Engine dafür neu kompiliert werden muss, dabei die Engine die Klasse aber kennt?

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

2

16.02.2006, 19:46

ableiten, mach alles als virtual dann muss er nur von den klassen ableiten und braucht nur den neuen teil zu kompilieren
Was es alles gibt, das ich nich brauche - Aristoteles

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

16.02.2006, 19:49

Das würde nicht gehen, weil die Klasse ja intern schon benutzt wird.. zB sollen die Spielfiguren von dieser Klasse abgeleitet werden, dann bringt es ja nichts wenn der Benutzer seine eigene Ableitung schreibt..

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

16.02.2006, 20:21

Du willst also eine engine zu einer austauschbaren Engine schreiben? Ich sehe da keinen Vorteil drinne. Ansonsten würden mir nur noch Funktionszeiger einfallen, wobei die natürlich auch schon stark einschränken.
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.

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

5

16.02.2006, 20:24

Na der Vorteil ist, das ich mir keinen Kopp um die Grafik machen muss und außerdem der Benutzer die Engine nehmen kann, die ihm am Besten gefällt.. Funktionszeiger wären ja schon ziemlich blöd weil ich dann keine Klasse mehr habe sondern nur ein Funktionssammelsurium. Da muss es doch irgendeine Schnittstelle geben oder?

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

6

16.02.2006, 20:49

Mir fällt gerade ein, dass es tatsächlich mit Vererbung und Templates gehen würde.. Der Benutzer leitet von der Basisklasse ab, schreibt die Klasse so wie er sie braucht und übergibt dann der Engine die Klasse per Template, die dann die Spielfiguren usw von der übergebenen Klasse ableitet. Komfortabel wäre das aber auch nicht gerade... Hat jmd noch ne bessere Idee?

edit:
Ableiten von Templates würde gar nichts bringen, wenn das überhaupt geht, weil ich dann ja wieder nicht die Funktionen der Klasse kenne. Wenn ich aber die Templateklasse als Membervariable vom Typen der Basisklasse in den Spielfiguren erstelle müsste ich jedesmal zum rendern usw erst ne Get Methode aufrufen, was ich nicht will. Gibts die Möglichkeit von einer Klasse abzuleiten die irgendwie durch ein Template festgelegt wird, von der ich aber weiß dass sie die Ableitung einer bekannten anderen Klasse ist, so dass ich die Funktionen schon benutzen kann? Tut mir leid das meine Ideen hier so reintröpfeln, ich hab gerade einen Brainstormingflash^^

bassdscho

Alter Hase

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

7

16.02.2006, 22:37

kuck dir mal den code der Irrlicht Engine an. ich wollte da kucken wie eine funktion funktioniert, dann ist mir aufgefallen das die in der leib schon alles virtual deklariert haben, aber doch alles selber implementiert hat.

Mir kommt das konfus vor, aber vielleicht hilfts dir ja ;p
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

8

16.02.2006, 22:53

Mir fallen da nur Interfaces ein (in C++ auch rein virtuelle Klassen bzw. abstrakte Klassen genannt).
Deklarierst einfach, wie die Klasse aussehen soll.
Dann kannst du zur Laufzeit aus einer Dll die Implementierung der Klasse laden, ohne dass du an dem System, welches die Klasse deklariert hat, etwas ändern musst.

PS: Ich hoffe ich hab dein Prob. richtig verstanden

mfg Philipp

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

9

16.02.2006, 22:55

@bassdscho: Kennst du noch die Datei in der das war? Brauch ich nicht so lang zu suchen :-D

Wars einfach nur ne Funktion die als virtual deklariert war aber schon implementiert war? Is ja nichts außergewöhnliches wenn du die Klasse benutzen willst aber die erbenden Klassen die Funktion überschreiben können sollen.. Oder war da noch mehr?

@Phil: Hört sich gut an.. Nur will ich ja nicht die Klasse aus einer Dll laden, sondern die Dll soll die Klasse aus dem Projekt laden. Gehts so rum auch? Wenn ja kannste mal den Code posten?

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

10

16.02.2006, 23:28

Das geht auch.

Sagen wir z.B.: die Klasse heißt Test.

in der DLL:

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
//Core.h

class __declspec(dllexport) Core
{
private:
  Renderer_Factory* rendersystem_;
  static Core& getInstance() 
  {
   static Core c;
   return c;
  }
  void setRenderSystem(Renderer_Factory* rs)
  {
     rendersystem_ = rs;
  }
  void run()
  {
    rs->doRender();
  }
}

//renderfactory.h

class Renderer_Factory
{
public:
  void doRedner(...) = 0;  //pure virtual

};


In deinem Projekt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
//x.cpp

class RenderSystem_D3D : public RenderSystem_Factory
{
   void doRender(...)
   {
   }
}

//main.cpp


RenderSystem_D3D* rs = new RenderSystem_D3D;
Core::getInstance().setRenderSystem(rs);
Core::getInstance().run();


sollte so funktionieren

mfg Philipp

Werbeanzeige