JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=0acbc4dfe14930eac1062b018e92ab3fMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Kapitel 29.4 AddObject() fehlt

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Bravo20
Mini JLI'ler



Anmeldedatum: 16.06.2008
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 17.06.2008, 11:25    Titel: Kapitel 29.4 AddObject() fehlt Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 18.06.2008, 09:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Bravo20
Mini JLI'ler



Anmeldedatum: 16.06.2008
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 19.06.2008, 11:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.06.2008, 13:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Bravo20
Mini JLI'ler



Anmeldedatum: 16.06.2008
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 19.06.2008, 14:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum