Problem beim laden einer .X-File



  • Hallo,

    ich bin grad dabei ein kleines spielchen zu schreiben, die neuerung (für mich) dabei ist dass es nicht mehr in 2D sondern in 3D is. Ich benutze C++ und DirectX9. ich hab da jetzt die Klasse 3DObject, wie in dem Beispielprogramm von dem buch, das ich gelesen habe, nur funktioniert das laden nicht. beim erstellen des programmes gibt es kein problem, erst beim ausführen.

    BOOL C3DObject::Load(char* xfile)
    {
        LPD3DXBUFFER lpMaterialBuffer;
    
        if(FAILED(D3DXLoadMeshFromX(xfile, 
                          D3DXMESH_MANAGED,
                          m_lpD3DDevice,
                          NULL,
                          &lpMaterialBuffer,
                          NULL,
                          &m_nNumMaterials,
                          &m_lpMesh)))
    	{
    		MessageBox(NULL,"Fehler beim Öffnen der Datei",NULL,MB_OK);
    		return FALSE;
    	}
    
        D3DXMATERIAL* lpMaterials = (D3DXMATERIAL*)lpMaterialBuffer->GetBufferPointer();
    
        m_lpMeshMaterials = new D3DMATERIAL9[m_nNumMaterials];
        m_lpMeshTextures = new char*[m_nNumMaterials];
    
        for(int i=0;i<m_nNumMaterials;i++)
        {
    
            m_lpMeshMaterials[i] = lpMaterials[i].MatD3D;
            m_lpMeshMaterials[i].Ambient = m_lpMeshMaterials[i].Diffuse;
    
            if(NULL != lpMaterials[i].pTextureFilename)
            {
    
                m_lpMeshTextures[i] = new char[strlen(lpMaterials[i].pTextureFilename)+1];
    
                strcpy(m_lpMeshTextures[i],lpMaterials[i].pTextureFilename);
    
                m_lpResManager->AddTexture(m_lpMeshTextures[i]);
            }
            else
            {
                m_lpMeshTextures[i] = NULL;
            }
        }
    	lpMaterialBuffer->Release();
    
        return TRUE;
    }
    

    beim ausführen des programmes krieg ich die fehlermeldung, dass das object nicht geladen werden konnte. Ich hab die .X file in alle ordnerebenen vom projekt getan, damit sie auf jeden fall vorhanden ist ;), trotzdem kommt die meldung. die X file sollte in ordnung sein, im mesh-viewer von DirextX wird sie richtig dargestellt, trotzdem hab ich ein object vom Beispielprogramm genommen um das auszuprobieren, leider ist auch das nicht gegangen :(.

    kann mir da irgendjemand helfen?? das wär ganz lieb 🙂

    danke schon im voraus



  • Auf Grund deiner Schreibweise nehm ich an das du VS benutzt. Da solltest du das x File im selben Ort lagern wo der Source liegt (vereinfacht gesagt).
    Ansonsten kannst du das File mal in den debug oder release Ordner legen und die Exe ausserhalb des Editors manuell dort starten.
    Wenn das alles nichts hilft lass dir in deiner Funktion mal den Wert des strings ausgeben mit dem Filenamen ...



  • hi, danke für deine antwort

    also bitte nicht lachen, denn ich hab nen echt dummen fehler gemacht (vergessen eine datei zu includen).

    Jetzt is aber leider ein anderes problem entstanden.

    ich hab den resourcenmanager, in dem die materialien gespeichert werden,
    dafür is der kontainer m_mapTextures,

    CResourceManager::~CResourceManager()
    {
    	map<string,LPDIRECT3DTEXTURE9>::iterator it;
    
    	for(it = m_MapTextures.begin(); it != m_MapTextures.end();it++)
    	{
    		(it->second)->Release();
    	}
    }
    

    und beim aufräumen, beim destruktor also, unterbricht das programm ewig bei dem befehl (it->second)->release() 😞
    woran könnte das denn das liegen?

    ich hoffe es weiß jeder was ich mein, dürft ja so standard sein 😃



  • Du released was, was du nicht releasen darfst. f'`8k

    Gruß, TGGC (\-/ returns)



  • Hey, sry, tut mir leid, das is keine absicht, danke für den hinweis, werd ich nicht mehr machen



  • hey,
    ich probiers anders,

    woran kann es liegen, dass mein programm unterbricht, wenn ich meine texturen mittels release() freigeben will 🙂

    das is echt wichtig

    vielen dank im voraus



  • Vielleicht hast du noch ein Object, was auf diese Texture zugreifen will, obwohl sie schon gelöscht wurde.
    Da muss man nur bei jedem neuen Objekt AddRef von der Texture in der stl-map aufrufen.



  • nein leider, ich hab momentan, zum test ob alles funzt, nur dieses eine objekt, und ich gebe die texture ja erst im destruktor frei 😞



  • Manchmal trift auch das Problem auf, dass wenn man das Fenster minimiert oder alt tab drückt, die Ressourcen verloren gehen. Da kann man einfach alles neu laden, wenn man WM_ACTIVATE erhält.



  • leider nicht :(, auch wenn das fenster den focus nicht verliert kommt meine fehler meldung;

    ich habs jetzt nochmal mit ner andren datei probiert, es geht nur darum sounds auszugeben, so lange es nur ein sound is, der geladen ist, und in der map(string, IDirectMusicSegment8) gespeichert ist, gibt er mir keine fehlermeldung, wenn ich aber 2 lade, dann is sie wieder da

    Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in Sounds.exe aufgetreten.
    
    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    

    kann das daran liegen wie ich die dateien freigebe? (bei der datei ganz gleich wie weiter oben in der andren)

    danke für die antwort 🙂



  • Also ich hab jetzt lang mit dem debuger herumprobiert (mit der 2. datei, der mit den sounds). Zuerst aber noch ne korrektur, die typen der map sind string und IDirectMusicSegment8*. Die eine wav datei hat dem progr scheinbar nicht gepasst, als ich sie durch ne andre erstetzt hab, hats gefunzt,

    kanns jetzt sein, dass, bei meinem wirklichen program, das model einen fehler hat, so dass meine load-function verwirrt wird??, wenn ja, wie kann ich denn das umgehen

    danke für jede antwort 🙂



  • heyyy, 🙂 nächste frage 😉

    wenn ich jetzt mein .x-file geladen hab, wie kann ich dann die dimensionen davon auslesen (länge breite höhe)???

    danke danke schon im voraus :);)



  • Indem du die Eckpunkte anschaust. f'`8k

    Gruß, TGGC (\-/ returns)



  • 💡 🙂 dankeschön, ich meld mich wieder 😉

    Edit: (sry, falls ich shcon zu nerven beginn) also ich hab ja jetzt so ne funktion geschrieben und die gibt mir auch breite, höhe und tiefe aus, nur stimmt das scheinbar nicht, denn bei meiner kollisionserkennung schreit er schon ein stückchen vorher, und als ich die von mir ausgegebenen maße mit den wirklichen (vom 3d studio) verglichen hab, hats um den betrag nicht gestimmt

    also ich habs so gemacht, dass ich sechs variablen angelegt hab (maxx, minx, maxy,...) und dann bin ich die ganzen vertices durch und hab, zb wenn die x-koordinate größer war als maxx, maxx auf die x-koordinate gesettz, und das gleiche wenns kleiner (nur umgekehrt :));

    sollte doch eigentlich stimmen oder?

    danke für eure hilfe


Anmelden zum Antworten