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)


Anmelden zum Antworten