Hanfling
In einem Spiel muss man normalerweise zwei verschiedene Dinge redern:
I. Den Hintergrund/Karte...
II. Objekte die sich in der Welt befinden und Sachen wie z.B. der Physik unterliegen, flexibel sind, die Anzahl nicht feststeht und ganze Zeit neu erstellt oder gelöscht werden.
Zu dem II. weiß ich nicht wie man es so richtig anpacken sollte, alle Objekte zu verwalten.
Evtl. so:
Es existiert eine Basisklasse CBaseObject, von der alles abgeleitet wird (z.B. CBaseEnemy, CBaseMapDecoration, usw.).
Dann eine LL basteln, in der alle Objekte dann drin sind, welche mit CBaseObject* arbeitet um auf das nächste Glied zu zeigen.
Alle Objekte die dareingespeichert werden, müssen dann nach CBaseObject gecastet werden.
Dann dürfte es glaube ich möglich sein, für alle Methoden aufzurufen, die überladen werden können, wie z.B.
void draw()
void handePhysic()
etc.
Nur ich weiß grad nicht ob das möglich ist mit dem umcasten + Methodenaufruf.
Sagt bitte was dazu oder macht Anregungen/neue Ideen.
/edit:
Das ganze soll in C++ geschrieben werden.
Moshroum
Ich empfehle da einfach alles einen Scenegraph der in deinem ScenenManager liegt. Gegen diesen kannst du relativ einfach alle Objekte gegeneinander testen. Das mit dem Draw und Handle sollte dann ne virtuelle Funktion deiner Basisklasse sein. Wenn du es rafiniert machst, dann kannst du alles beschleunigen, indem du deine Welt (I) in Sektoren aufteilst. Wichtig ist nur, dass du ersteinmal gegen die Welt testest und dann gegen die einzelnen Objekte. Genauer kannst du es auch (sry, wegen Fremdwerbung) unter
www.zfx.info erfahren.
Hanfling
Ahja, keine Ahnung was du meinst, aber klingt irgendwie ziemlich so wie ich es eh machen will.
Moshroum
scenegraph ist der ausdruck für das, was du vielleicht machen wolltest (wobei dazu einiges mehr gehört als das was du angesprochen hast). du solltest aber darauf achten, dass du die daten nicht in dem graph speicherst sondern extern und sozusagen nur klassen hast die pointer auf die richtigen daten haben. das ist wichtig, da du dadurch einen resourcenmanager einbauen kannst, der die daten verwaltet und du dann nicht alles zig mal im speicher hast
Hanfling
Wieso sollte ich die mehrmals im Speicher haben, wenn die Pointer vom Typ CBaseObject aufs nächte/vorherige haben? Und so in einer Linked List verknüpft sind.
Ich versteh ned den unterschied, wenn das direkt so ist, oder nur Objekte draufzeigen.
Moshroum
stell dir mal vor, dass du ne karte hast auf der 100 bäume sind. davon gibt es 10 typen. also würdest du 10x soviel im speicher haben, wenn du nicht einfach nen resourcenmanager hast, der dann die objekte und referenzen verwaltet. besser wäre dann folgendes: in deinem scenegraph hast du dann alle 100 bäume (ohne zb deren vertexdaten), aber dafür ein pointer auf die vertexdaten, die der resourcenmanager verwaltet.
kleines beispiel:
meshnode : scenenode
{
.....
void load(...);
void release(...);
resourcenref<mesh> meshref;
.....
}
resourcenref<T>
{
void load(...);
void release(...);
T* p;
......
}
mesh
{
refcounter rcount;
void load(...);
void release(...);
}
also: du willst nun deine meshnode mit dem baum ausrüsten. dazu rufst du einfach load des scenenode auf. diese funktion macht dann nix anderes als das load der resourcenreferenz aufzurufen. diese ruft dann den resourcenmanager auf, der feststellt ob die resource vielleicht schon geladen ist (irgendwo sollte er ne list haben in dem alle namen der resourcen gespeicher sind). sollte er dort den dateinamen des meshes finden, dann kann er den pointer zu der resource an den resourcenref zurückgeben. der speicher den pointer und der rcount des meshes wird erhöht. sollte es nicht geladen sein, dann läd der resourcenmanager einfach über mesh::load den mesh und speichert in in der list ab. nun gibt er noch noch den pointer an den resourcenref weiter und erhöht den rcount auf 1. braucht man den scenenode ruft man release auf. dann wird es von refcount an den resourcemanager weitergegeben. der verringert nun rcount um 1. sollte dieser auf 0 gesunken sein, dann ruft der resourcenmanager dann mesh::release auf, der dann die vertexdaten komplett freigibt. ganz einfach, oder? wenn man nun aber den mesh die möglichkeit geben will, dass er nicht entladen wird, dann kann man auch spezielle flags einarbeiten. kommt ganz darauf an für was du es brauchst.
achja, noch etwas zum scenegraph. da kommt wirklich alles rein. also auch texturen, lights etc.
Hanfling
Ok.
Ist aber irgendwas was anders als du oben gesagt hast.
/edit
Warum soll ich da Texturen reintun?
Da du kein Windows hast, musst du wohl eh OpenGL verwenden, und da wird ja bekanntlicherwiese nur mit einem unsigned int für eine Textur gearbeitet.
Moshroum
Nö. nur weil du es falsch verstanden hast soll es anders sein?
Achja, hiermit geb ich dir dein Vollhonk vom andern Thread zurück
Hanfling
"Daten" ist ja so ein klares Wort der direkt sagt was du meinst.