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
Anonymous
unregistriert
Anonymous
unregistriert
Anonymous
unregistriert
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
// Hilfsmakro um COM-Objekte ordentlich freizugeben. template<typename T> inline void safeRelease (T*& object) { // Ist das Object 'NULL'? if (object != NULL) { // Nein das Object ist noch nicht 'NULL'! Also Freigeben und // auf 'NULL' setzen. object->Release (); object = NULL; } } // für Freundschaften schonmal bekannt machen class polygon; class scenemanager; // Klasse für Materials class material { public: // Constructor, Copyconstructor und Destructor material (const ::D3DMATERIAL& material, const ::IDirect3DTexture9*& texture) : material_(material), texture_(texture) {} material (const material& other) : material_(other.material_), texture_(other.texture_) {} ~material (void) { safeRelease (texture_); } // Freundschaften friend class polygon; // Polygon hat vollzugriff auf private Elemente von material friend class scenemanager; // scenemanager hat vollzugriff private: // Materialeingenschaften ::D3DMATERIAL material_; // Material von Direct3D ::IDirect3DTexture9* texture_; // Texturobjekt }; // Klasse für Polygone class polygon { public: // Constructor und Copyconstructor polygon (unsigned long fvf, unsigned long num_vertices, unsigned long num_indices, const ::vertex* vertices_, unsigned long* indices_, const ::material& mat) : fvf_(fvf), num_vertices_(num_vertices), num_indices_(num_indices), vertices_(vertices), indices_(indices), material_(mat) { // CreateVertexBuffer und CreateIndexBuffer ausführen } polygon (const polygon& other) : fvf_(other.fvf_), num_vertices_(other.num_vertices_), num_indices_(other.num_indices_), vertices_(other.vertices_), indices_(other.indices_), material_(other.material_) { // CreateVertexBuffer und CreateIndexBuffer ausführen } ~polygon (void) { // Aufräumen nicht vergessen! safeRelease (vb_); // VertexBuffer safeRelease (ib_); // Indexbuffer } // Freundschaften friend class scenemanager; // Vollzugriff von scenemanager. protected: unsigned long fvf_; // Dein FVF unsigned long num_vertices_;// Anzahl vertices für dieses Polygon unsigned long num_indices_; // Anzahl indices für dieses Polygon ::vertex* vertices_; // Die Vertices des Polygons unsigned long*indices_; // Die Indices des Polygons ::material material_; // Das Material ::IDirect3DVertexBuffer9* vb_; // VertexBuffer ::IDirect3DIndexBuffer9* ib_; // IndexBuffer }; // Der Scenemanager. ACHTUNG: Hier wäre eine Freundschaft zu deiner D3D Klasse sehr hilfreich! class scenemanager { private: // Con- und Destructor scenemanager (void); scenemanager (const scenemanager& other); ~scenemanager (void); // Es gibt nur eine Instanz. Jede Zuweisung wäre eine Selbstzuweisung. // Da Selbstzuweisungen selten Sinn machen, ist der op= privat scenemanager& operator= (const scenemanager& other); public: // Diese statische Methode erzeugt die einzige Instanz. // Nur über diese Methode erhalten Anwender den Zugriff auf // die Instanz. inline static scenemanager& getInstance (void) { // Die Instanz wird erst beim ersten Aufruf erzeugt. // Endet das Programm, wird Instanz vernichtet. static scenemanager instance; return (instance); } void addPolygon (const ::polygon* poly) { // Polygon in die Liste hinzufügen polygon_.push_back (poly); } void renderAll (void) { // Alles sortieren! sortPolygons (); // Alle Polygone durchlaufen lassen for (polygon_it_ = polygon_.begin(); polygon_it_ != polygon_.end(); ++polygon_) { // Textur setzen, falls nötig (Hier sollte ein Texturmanager zum einsatz kommen!! Bringt Speed texturemanager::getInstance().setTexture ((*polygon_it_)->material_.texture_); // Dein Material setzen direct3d::getInstance().setMaterial ((*polygon_it_)->material_.material_); // Dein FVF setzen direct3d::getInstance().setFVF ((*polygon_it_)->fvf_); // VertexBuffer setzen, Indexbuffer setzen, Rendern --> Fertig! // [...] } // Manager für nächsten Frame fertigmachen! Ergo: alle Polygone rauswerfen polygon_.clear (); } private: // Funktion zum sortieren der Polygone void sortPolygons (void) { // Hier nach Texturnamen sortieren. } // Das wichtigste vom Wichtigsten std::list<polygon*> polygon_; // Liste für Polygone std::list<polygon*>::iterator polygon_it_; // Iterator für Polygonliste } Benutzung: // Bei beginn des Programms ein Polygon erstellen polygon poly (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_XXX, anzahl_vertices, anzahl_indices, vertexpointer, indexpointer, ::material (irgendein_d3dmaterial, dein_texturobjekt)); // Hauptschleife { if (sichtbar(poly)) scenemanager::getInstance().add(&poly); scenemanager::getInstance().renderAll(); } |
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 |
#include <iostream> #include <string> #include <list> #include <algorithm> class person { public: person (std::basic_string<wchar_t> value) : name(value) {}; std::basic_string<wchar_t> name; }; bool compareByName(const person& left, const person& right) { return left.name < right.name; } int main (void) { std::list<person> pers; std::list<person>::iterator pers_it; pers.push_back (person(L"alfred")); pers.push_back (person(L"alfonso")); pers.push_back (person(L"jehova")); pers.push_back (person(L"peter")); pers.push_back (person(L"alfonso")); pers.push_back (person(L"bernd")); pers.push_back (person(L"pikaboo")); pers.push_back (person(L"peter")); pers.push_back (person(L"peter")); pers.push_back (person(L"alfonso")); pers.push_back (person(L"buddha")); pers.push_back (person(L"jehova")); pers.push_back (person(L"bernd")); pers.push_back (person(L"alfonso")); pers.sort(compareByName); for (pers_it = pers.begin(); pers_it != pers.end(); ++pers_it) { std::wcout << pers_it->name << std::endl; } std::cin.get(); return 0; } |
Zitat von »"Patrick"«
Bei Grafikprogrammierung ist dieser ausschlaggebende Punkt nunmal der Bustransfer.
Zitat
am besten nach std::basic_string<wchar_t> sortieren, Strings sind schneller zu vergleichen als riesige Pointerobjekte
Werbeanzeige