Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Bravo20 Mini JLI'ler
Anmeldedatum: 16.06.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 17.06.2008, 11:25 Titel: Kapitel 29.4 AddObject() fehlt |
|
|
Hallo am ende von kapitel 29.4 steht:
das der klasse CScene die methode AddObject() hinzugefügt wird
die alle 3dobjekte mit hilfe einer liste rendert.
aber im quelltext ist davon nichts zu sehen, wäre nett wenn jemand ein beispiel posten könnte |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 18.06.2008, 09:21 Titel: |
|
|
Natürlich kann ich jetzt nicht fürn Christian sprechen (der große Herr und Meister *Kniefall*).
Aber eine mögliche Implementierung könnte so aussehen, dass du einen Objekt-Manager als Klasse zwischen schaltest.
Evt. könnte so die Klassendeklaration aussehen:
CPP: | class C3DObjectManager
{
public:
C3DObjectManager(); //Konstruktor
~C3DObjectManager(); //Destruktor
// hier geben Sie die Adresse des ResoucenManager an
void SetResouceManager(CResourceManager* Manager);
// Anlegen eines neuen C3DObjects
void AddObject(int ID, const char* xfile);
// hier wird anhand einer eindeutigen ID ein Zeiger auf das gewünschte C3DObject zurückgegeben
C3DObject* GetMemberPtr(int ID);
// Rendern aller Meshes
void Render(void);
protected:
// Zeiger auf den ResourcenManager
CResourceManager* m_lpResManager;
// map, in der alle C3DObjecte gespeichert werden(bzw. ein Zeiger darauf)
map<int, C3DObject*>m_ObjectMap;
}; |
Du legst dann quasi über diese Klasse alle deine C3DObjecte an. Diese enthalten dann auch alle eine eindeutige ID, um später einen Zugriff noch auf jedes Bestimmte Object von der Klasse zu erhalten (C3DObject* GetMemberPtr(int ID);).
C3DObjectManager speichert hier dann alle Zeiger der angelgeten Objekte in ner map unter dem angegebenen int-Schlüssel.
Bei Aufrufen wie, Render oder dem Destruktor müssen dann alle Elemente der map einzelln durchgegangen werden. |
|
Nach oben |
|
|
Bravo20 Mini JLI'ler
Anmeldedatum: 16.06.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 19.06.2008, 11:46 Titel: |
|
|
danke
habs in der zwischenzeit mittels einer liste gelöst
aber deine möglichkeit finde ich auch interessant
nur wie ist das mit der funktion GetMemberPtr(int ID) bzw. m_ObjectMap[ID]
wird da die map intern wie eine liste vom anfang bis zur ID durchlaufen und dann das objekt zurückgegeben? oder erfolgt der zugriff direkt wie bei einem array? bei ersteres wäre das natürlich verschwendung wenn man zur laufzeit auf ein bestimmtes objekt zugreifen will um es bspw. zu verändern,
da ja die liste immer wieder durchlaufen muss |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.06.2008, 13:20 Titel: |
|
|
Bravo20 hat Folgendes geschrieben: | nur wie ist das mit der funktion GetMemberPtr(int ID) bzw. m_ObjectMap[ID] wird da die map intern wie eine liste vom anfang bis zur ID durchlaufen und dann das objekt zurückgegeben? oder erfolgt der zugriff direkt wie bei einem array? bei ersteres wäre das natürlich verschwendung wenn man zur laufzeit auf ein bestimmtes objekt zugreifen will um es bspw. zu verändern,
da ja die liste immer wieder durchlaufen muss |
also die Map implementiert den operator[] als als such-operator, und zwar ist eine map ein sortierter binär-baum. D.h. dass die Wertepaare nach Größe des Schlüssels soriert vorliegen (also hier nach der Größe der int-Werte). Bei operator[] wird die Map nicht wie eine Liste von vorne nach hinten durchlaufen sondern anhand der Größe des übergebenen Wertes (also hier ID) durchsucht. Ist die Stelle gefunden wird der zugehörige 2. Teil des Wertepaares (hier CD3DObject*) als Referenz zurückgegeben. Das Ganze ist durch die Sortierung wesentlich schneller als das Durchlaufen einer Liste, deshalb bietet sich u.A. die Map hier an.
Gruß DXer |
|
Nach oben |
|
|
Bravo20 Mini JLI'ler
Anmeldedatum: 16.06.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 19.06.2008, 14:58 Titel: |
|
|
ahja gut zu wissen danke
ich werd mir dann doch lieber einfach nur einen zeiger auf das objekt speichern und so das objekt verändern, zum rendern lauf ich dann halt einmal die liste/map/vector (muss mal schauen was den zweck am besten erfüllt) durch und gut ist |
|
Nach oben |
|
|
|