Blöder TexturManager funzt net
-
Hi,
ich hab nen Texturmanager gecodet, nur dieser Blödmann will mir nicht die Textur zurückgeben! Position im Vector kann ich bekommen, aber nur diese blöde Textur nicht! *aufreg*
Hier der code:
#ifndef _CTEXTUREMANAGER_H_ #define _CTEXTUREMANAGER_H_ // I N C L U D E S ////////////////////////////////////////////////////////////////// #include <windows.h> #include <d3d9.h> #include <d3dx9.h> #include <vector> #include "CVideo.h" #include "CLog.h" // D E F I N I T I O N E N ////////////////////////////////////////////////////////// // Noch keine // S T R U K T U R E N ////////////////////////////////////////////////////////////// class CTextureItem { public: std::string FileName; LPDIRECT3DTEXTURE9 Texture; D3DXIMAGE_INFO ImageInfo; }; class CTextureManager { public: static CTextureManager &getInstance (void) { return (m_Instance); } CTextureItem getTexture (std::string FileName, D3DCOLOR color=0xFF000000); CTextureItem getTexture (int ID, D3DCOLOR color=0xFF000000); int getTextureID (std::string FileName, D3DCOLOR color=0xFF000000); void deleteTexture (std::string FileName); void deleteTexture (int ID); void deleteAllTextures (void); void setTextureByID (int ID); private: CTextureManager (void); ~CTextureManager(void); static CTextureManager m_Instance; CTextureItem loadTexture (std::string FileName, D3DCOLOR color=0xFF000000); std::vector<CTextureItem> m_vec_TextureItems; }; #endif
Hier die Cpp:
// I N C L U D E S ////////////////////////////////////////////////////////////////// #include "CTextureManager.h" CTextureManager CTextureManager::m_Instance; // F U N K T I O N E N ////////////////////////////////////////////////////////////// CTextureManager::CTextureManager (void) { } CTextureManager::~CTextureManager (void) { for (int i=0; i < this->m_vec_TextureItems.size(); ++i) { if(this->m_vec_TextureItems[i].Texture != NULL) { this->m_vec_TextureItems[i].Texture->Release(); this->m_vec_TextureItems[i].Texture = NULL; } } } CTextureItem CTextureManager::getTexture (std::string FileName, D3DCOLOR color) { // Gucken ob Textur im Manager enthalten ist: for (int i=0; i < this->m_vec_TextureItems.size(); ++i) { if (this->m_vec_TextureItems[i].FileName.compare (FileName.c_str())) { return (this->m_vec_TextureItems[i]); } } // Textur ist im Manager nicht drin: Laden return (this->loadTexture(FileName, color)); } CTextureItem CTextureManager::getTexture (int ID, D3DCOLOR color) { return (this->m_vec_TextureItems[ID]); } int CTextureManager::getTextureID (std::string FileName, D3DCOLOR color) { // Gucken ob Textur im Manager enthalten ist: for (int i=0; i < this->m_vec_TextureItems.size(); ++i) { if (this->m_vec_TextureItems[i].FileName.compare (FileName.c_str())) { return (i); } } // Textur ist im Manager nicht drin: Laden loadTexture(FileName, color); // Und nochmal durchjagen um die ID zu bekommen: for (int i=0; i < this->m_vec_TextureItems.size(); ++i) { if (this->m_vec_TextureItems[i].FileName.compare (FileName.c_str())) { return (i); } } return (-1); } void CTextureManager::deleteTexture (std::string FileName) { CLog &Protokoll = CLog::getInstance(); // Gucken ob Textur im Manager enthalten ist: for (int i=0; i < this->m_vec_TextureItems.size(); ++i) { if (this->m_vec_TextureItems[i].FileName.compare (FileName.c_str())) { // Textur releasen if(this->m_vec_TextureItems[i].Texture != NULL) { this->m_vec_TextureItems[i].Texture->Release(); this->m_vec_TextureItems[i].Texture = NULL; } this->m_vec_TextureItems.erase(&this->m_vec_TextureItems[i]); Protokoll << "HINWEIS: DirectGraphics : Textur aus Speicher gelöscht: \'" << FileName << "\' (" << __FILE__ << ", " << __LINE__ << ")\n"; return; } } // Textur ist nicht drin, auch gut } void CTextureManager::deleteTexture (int ID) { // Kann die Textur im Vector sein? if ((ID > this->m_vec_TextureItems.size()) || (ID < 0)) return; CLog &Protokoll = CLog::getInstance(); std::string NameBuffer; if(this->m_vec_TextureItems[ID].Texture != NULL) { this->m_vec_TextureItems[ID].Texture->Release(); this->m_vec_TextureItems[ID].Texture = NULL; } NameBuffer = this->m_vec_TextureItems[ID].FileName; this->m_vec_TextureItems.erase(&this->m_vec_TextureItems[ID]); Protokoll << "HINWEIS: DirectGraphics : Textur aus Speicher gelöscht: \'" << NameBuffer << "\' (" << __FILE__ << ", " << __LINE__ << ")\n"; } void CTextureManager::deleteAllTextures (void) { CLog &Protokoll = CLog::getInstance(); // Gucken ob Textur im Manager enthalten ist: for (int i=0; i < this->m_vec_TextureItems.size(); ++i) { if(this->m_vec_TextureItems[i].Texture != NULL) { this->m_vec_TextureItems[i].Texture->Release(); this->m_vec_TextureItems[i].Texture = NULL; } this->m_vec_TextureItems.erase(&this->m_vec_TextureItems[i]); } this->m_vec_TextureItems.clear (); Protokoll << "HINWEIS: DirectGraphics : Alle Texturen im Speicher gelöscht. (" << __FILE__ << ", " << __LINE__ << ")\n"; } CTextureItem CTextureManager::loadTexture (std::string FileName, D3DCOLOR color) { CLog &Protokoll = CLog::getInstance(); CVideo &VideoClass = CVideo::getInstance(); CTextureItem temp_TextureItem; temp_TextureItem.FileName = FileName; D3DXCreateTextureFromFileEx(VideoClass.getDevice(), FileName.c_str(), NULL, NULL, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, color, &temp_TextureItem.ImageInfo, NULL, &temp_TextureItem.Texture); this->m_vec_TextureItems.push_back (temp_TextureItem); Protokoll << "HINWEIS: DirectGraphics : Datei geladen: \'" << FileName << "\' (" << __FILE__ << ", " << __LINE__ << ")\n"; return (temp_TextureItem); }
Das regt mich auf! Seit 3 Stunden sitz ich da nun dran und finde den fehler nicht!
So Versuch ich an das LPDIRECT3DTEXTURE9 Object zu gelangen:
// [...] CTextureManager &TextureManager = CTextureManager::getInstance(); // [...] VideoClass.getDevice()->SetTexture (0, TextureManager.getTexture(this->m_FileName).Texture);
Die Position im Vector kann ich bekommen sogar ein CTextureItem aus dem vector löschen, aber wieso verdammt noch mal komm ich net an das Texturobject?????
Bitte helft mir...
-
*push*
-
Warum schreibst du dir nicht einfach einen intelligenten Texturmanager?
-
@TGGC:
Sag mir was das ist, dann überleg ichs mir! Ist ja net jeder hier der King der allwissend ist, ne?
-
k.A. was genau das ist. Aber wenn du schon einen blöden Texturmanager geschrieben hast?
-
Original erstellt von TGGC:
k.A. was genau das ist. Aber wenn du schon einen blöden Texturmanager geschrieben hast?Wie oft wirst Du eigentlich am Tag als A-r-s-c-h-l-o-c-h bezeichnet? Denn Du bist ein gewaltiges.
-
Ja, streitet euch!
-
Hehe, wir sollten mal'n Boxring aufmachen...
Obwohl, am meisten kannst Du's TGGC wahrscheinlich zurückgeben, indem Du ihn in OSR schlägst...
-
Original erstellt von <Ikari>:
Wie oft wirst Du eigentlich am Tag als A-r-s-c-h-l-o-c-h bezeichnet? Denn Du bist ein gewaltiges.Also das hilft sicher genau so wenig wie ein grosser Haufen Quellcode um 'ne sinnvolle Antwort zu bekommen.
-
mal eine frage an ikari:
warum verwendest du immer this?
this wird in der regel verwendet um festzustellen ob ein objekt das aktuelle ist, z.b. in einer setmethode:
void CMyClass::SetMyClass(CMyClass *MyClass) { if (MyClass==this) { printf("Selbstzuweisung macht keinen Sinn"); } else { doSetMyClass } }
machst du das aus rein optischen gründen?
[ Dieser Beitrag wurde am 14.05.2003 um 06:54 Uhr von KXII editiert. ]
-
Original erstellt von KXII:
**machst du das aus rein optischen gründen?
**nein, er macht das aus idiotischen, nicht nachvollziehbaren Gründen
-
das glaube ich nicht!
er wird schon seinen grund haben, der bestimmt auch nachvollziehbar ist.
-
Nein aus Optischen und für die Autovervollständigung von .NET damit man net alle Variablen hinschreibenmuss.
Hat nix mit Idiotismus zu tun sondern mit reiner Faulheit Variablen zu schreiben.
-
obiges gind natürlich an "!"
wenn du .net benutzt dann würde ich dir das makro __FUNCTION__ empfehlen! ist besser als __LINE__ und __FILE__. denn line änder sich ja praktisch bei jemand return... was bringt da einem die zeilenangabe von eienr 3 monaten alten funktion in eienr cpp datei. __FUNCTION__ gibt dir die funktion zurück in der es steht also z.b. "CTextureManager::getTexture" ist sehr praktisch zum erstellen von fehlermeldungen a la:
"CMyApplication->Init->m_DirectX->CreateDevice->BlaBla->Blubba->...->..."
haste bestimmt auch schon mal gesehen solche tollen fehlermeldungen (z.b. in UT2003)