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

Jumping Jack

Treue Seele

  • »Jumping Jack« ist der Autor dieses Themas

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

1

25.11.2002, 21:13

Speichermanager, HTML-Log, OOP

Hi,

meine erste Frage betrifft den Speichermanager:
Hast du dir so eine art Heapmanager geschrieben?
Wie macht man sowas? Gibt es gute Tutorials dafür?

meine zweite Frage betrifft die HTML-Log klasse:
Besteht die datei einfach nur aus (HTML)Text oder richtige Tabellen und sowas?
Kann man Tabulatoren einbauen?

und meine dritte frage:
Ich bin dabei ein Spiel oder eher erstmal eine Engine zu planen.
Allerdings habe ich ein paar probleme mit der organisation, strukturierung und namensgebung.

Meine Engine klasse sieht ungefähr so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
class CEngine
{
     CGraphics  *m_pGraphics; 
     CInput *m_pInput;
     CAudio *m_pAudio;
     CNetwork   *m_pNetwork;
     CLog   *m_pLog;

     static CClassFactory *m_pClassFactory; 
}



Sieht soweit ganz ordentlich aus denke ich.

CGraphics soll also die grafik schnittstelle darstellen.
Die klasse hat zwei Member variablen, eine vom typ CDirect3D und eine vom typ COpenGL.
Die CGraphics klasse bzw die Methoden dieser klasse sollen nun die grafik daten
also vertices und texturen an eine der klassen, je nachdem was man ausgewählt hat, weiterleiten.

Ich habe das jetzt mal so gemacht, dass die CGraphics methoden die daten zB in der form
CVertexBuffer und CTextureIndex bekommen.
Jetzt sollen die Methoden aus dem TextureManager die Texturen raussuchen(CTexture).

Jetzt werden diese typen entweder in CD3D... oder COGL... typen umgewandelt werden.
Diese klassen sind dann speziell für OpenGL oder D3D zugeschnitten.

Ich weiß jetzt allerdings nicht ob das sehr sinnvoll ist :-)
und ob irgendwo Probleme auftreten könnten.

Und dann hab ich noch ein paar klassen
wo ich mir noch über den namen und die extras gedanken mache:
------------------------------------------------------------
CMesh
Was soll diese klasse alles enthalten?
Ich habe mir gedacht: Vertices und Texturen (also den Index der Textur)
kann man denke ich für statische objekte verwenden.

CModel
Diese Klasse enthält bei mir:
Ein Modell mit Animationen, Lichtern, Decals, Effekten wie Partikelsystemen usw.

CObject
Diese Klasse steht für ein richtiges Spiel Objekt, also mit KI.
------------------------------------------------------------

Diese 3 Klassen sind sozusagen die High Level Klasse, die also in der Game Klasse verwendet werden.
Sie bestehen alle aus den einfacheren low level Klassen wie CVertexBuffer und CTextureIndex usw.
Die high level klassen haben eine eigene draw methode, die low level klassen nicht. Sie werden an funktionen übergeben.


Ich weiß jetzt nicht, ob ich die Effekt und Lichter mit in die Model klasse tun sollte
oder eher in die Object klasse oder ganz woanders hin, und ob das mit der Mesh klasse sinnvoll ist.

Scheiss viel Text :-)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

25.11.2002, 21:34

Re: Speichermanager, HTML-Log, OOP

Willkommen im Forum erst einmal! Langsam kommen hier immer mehr Besucher! :)

Zitat von »"Jumping Jack"«

meine erste Frage betrifft den Speichermanager:
Hast du dir so eine art Heapmanager geschrieben?
Wie macht man sowas? Gibt es gute Tutorials dafür?

Intern wird eine Liste über alle reservierten Speicherbereiche geführt (verkettete Liste). Das Ganze ist eigentlich eher dazu gedacht, den Programmierer auf "schludrigen Stil" aufmerksam zu machen, wenn er z.B. vergisst, einen Speicherbereich wieder freizugeben - das wird nämlich dann mit einer schönen orangenen Warnung in der Logbuchdatei bestraft.

Zitat von »"Jumping Jack"«

meine zweite Frage betrifft die HTML-Log klasse:
Besteht die datei einfach nur aus (HTML)Text oder richtige Tabellen und sowas?
Kann man Tabulatoren einbauen?

Also Du kannst der Logbuchfunktion (tbWriteToLog) wie der printf-Funktion einige Argumente übergeben und so Text ins Logbuch schreiben. Eine Tabelle wird dabei automatisch erstellt, wobei in der linken Spalte der Text steht und in der rechten der Ort, an dem die Information geschrieben wurde (CPP-Dateiname, Zeilenangabe und ggf. Funktionsname). Tabulatoren... gibt es dafür einen HTML-Tag? Ich glaube nicht, oder?

Zu Deiner Engine: ja, das sieht gut aus! Bei meiner Engine ist es auch nicht viel anders. Ich habe auch mal mit zwei Rendering-APIs gearbeitet (auch D3D + OpenGL) und beide in eine Engine gepackt. Damals habe ich es so gelöst:
Die Renderer-Klasse bestand aus einer Reihe von Funktionszeigern für das Zeichnen von Dreiecken, Setzen einer Textur und so weiter.
Hat der Benutzer dann D3D ausgewählt, so wurden alle Funktionen aus der Direct3D-Renderer-DLL geladen (dynamisch mit LoadLibrary und GetProcAddress) und die Funktionszeiger wurden auf diese Adressen gesetzt. Bei OpenGL ebenso, nur eben dann aus der Datei GLRenderer.dll anstatt D3DRenderer.dll.
Diesen Ansatz fand ich sehr elegant ;)

Wenn Du Deine Engine nur für ein einziges Spiel schreibst, sie also nicht "allgemein" bleiben soll, dann sind die Ideen für CMesh, CModel und CObject gut - ich würde es wahrscheinlich ebenso machen.

Jumping Jack

Treue Seele

  • »Jumping Jack« ist der Autor dieses Themas

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

3

25.11.2002, 21:43

danke erstmal :-)

für tabulatoren gibt es in HTML denke ich keinen befehl, genau das war nämlich mein problem. Ich habs mit   versucht, aber das ist scheisse, der ganze HTML source vollgrmüllt.
Ich hatte früher eine ganz normal txt logfile, dort habe ich tabulatoren verwendet. Die haben SEHR zur übersichtlichkeit beigetragen.
Ich habe dann eben auf HTML umgestellt, weil man damit mehr möglichkeiten hat. Allerdings wollte ich die Tabulatoren beibehalten, aber das scheint nicht so einfach zu sein :-(
Ich denke mal ich werde dann geschachtelte Tabellen oder so verwenden um ein bischen übersicht und ordnung reinzubringen.

Das mit den Render dlls ist ne echt gute idee. dazu müsste ich mir dann aber n bischen wissen über Dlls besorgen. naja, wird hoffe ich mal nicht so schwer :-)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

25.11.2002, 21:52

Das mit den DLLs ist wirklich nicht sehr schwer. Erstelle einfach ein neues DLL-Projekt und dann kann es los gehen. Wichtig ist, dass Du ein extern "C" {...} um alle Funktionen, die exportiert werden sollen, machst. Denn nur so wird garantiert, dass die Funktionsnamen beibehalten werden. Funktionen mit gleichen Namen, aber verschiedenen Parametern sind nicht möglich, da alles im C-Stil deklariert wird. Das macht aber eigentlich auch nichts.
Eventuell musst Du die Funktionen auch noch mit __declspec(dllexport) deklarieren (bin mir nicht sicher, ob das hier wirklich nötig ist).

Später kannst Du dann die Funktionszeiger recht einfach laden. Erst die DLL mit LoadLibrary laden und dann GetProcAddress benutzen, um die Adresse jeder Funktion in der DLL abzufragen. Die weist Du dann einfach den Funktionszeigern zu.

Jumping Jack

Treue Seele

  • »Jumping Jack« ist der Autor dieses Themas

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

5

25.11.2002, 21:56

ok, vielen dank, ich werds dann mal versuchen.

Jumping Jack

Treue Seele

  • »Jumping Jack« ist der Autor dieses Themas

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

6

26.11.2002, 14:54

wie würde aus deiner sicht denn ein allgemeineres modell für die klassen aussehen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

26.11.2002, 15:42

Zum Beispiel würde ich KI-Methoden niemals - jedenfalls nicht, wenn ich eine recht allgemeine Engine schreiben will - irgenwo reinpacken. Wahrscheinlich würde es auch kein CObject geben, da das ja wirklich sehr vom Spiel abhängt. Die Engine würde einfach nur die Grunfunktionen bieten und CObject würde dann vom Spiel implementiert und wäre kein Teil der Engine. So würde ich es machen.

MAG

Frischling

Beiträge: 37

Wohnort: Berlin / Brandenburg

Beruf: Angehender Student

  • Private Nachricht senden

8

26.11.2002, 18:13

Naja,man könnte meiner Meinung nach die Klassen CObject etc. ruhig nehmen.Dann sollte man aber vieleicht an eine abstrakte Klasse denken.
Also ich würde es zumindest so machen. :lol:
Ich würde ja gerne die Welt verändern, aber Gott gibt mir den Quelltext nicht!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

26.11.2002, 20:10

Aber auf keinen Fall mit integrierten KI-Funktionen. Denn sowas allgemein zu machen, so dass es auf jedes Spiel anwendbar ist, das kannst Du wohl vergessen. Für die anderen Sachen, die zu einem Objekt gehören, eigentlich auch: alles, was wahrscheinlich bei allen Spielegattungen gleich ist, ist die Positionsangabe des Objekts, die Bewegung, die Rotation und vielleicht noch ein Energiewert...

Jumping Jack

Treue Seele

  • »Jumping Jack« ist der Autor dieses Themas

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

10

26.11.2002, 20:29

achso, dann hast du mich falsch verstanden:

die CObject Klasse, die CModel klasse CParticle... und die CMesh klasse sowie VertexBuffer und so ein geometrie zeugs sind nicht teil der engine.
Diese klassen werden in der CApplication klasse, also der eigentlich anwendung verwendet. Die CObject klasse enthält zB eine CModel Instanz.
Die methode CObject::Draw() ruft dann die Draw() methode der CModel klasse auf und diese schickt schließlich die Geometrie daten und Texture Indices an die Engine und die Zeigt dann alles an.
Außerdem hat die CObject klasse noch eine Think() methode,
dort steht die KI (nicht ganz).
die Think Methode ist virtuell dh die CObject klasse ist mehr eine Basis klasse von der dann die eigentlichen Objecte abgeleitet sind.

Werbeanzeige