JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Problem mit X-Files
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 26.10.2004, 13:12    Titel: Problem mit X-Files Antworten mit Zitat

Ich bin gerade im letzten Kapitel vom Buch und hab ein kleines Problem mit den x-Files. Ich hab zum üben die klasse erstmal nahezu unverändert übernommen, so wie Sie im Buch vorkam. Jetzt hab ich das Problem, wenn ich beiliegendes X-File Cube.x beispielsweise lade kracht mir das Programm komplett ab. Lade ich ein selbsterstelltes x-File was weder textur noch großartige materialien hat, wird's angezeigt.

Hat jemand eine Ahnung woran das liegen könnte?
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.10.2004, 13:22    Titel: Antworten mit Zitat

Fehlende Texturen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 26.10.2004, 14:06    Titel: Antworten mit Zitat

Kann eigentlich nicht sein, weil auch cube.x von der Buch-CD keine Texture hat.

Ich glaub ich bin schon einen schritt weiter. Es muss an der Ladefunktion liegen:

Code:

BOOL C3DObject::Load(char* xfile)
{
    LPD3DXBUFFER lpMaterialBuffer;

    D3DXLoadMeshFromX(xfile,
                      D3DXMESH_MANAGED,
                      m_lpD3DDevice,
                      NULL,
                      &lpMaterialBuffer,
                      NULL,
                      &m_nNumMaterials,
                      &m_lpMesh);
   
    // Zeiger auf die verwendeten Materialien
    D3DXMATERIAL* lpMaterials = (D3DXMATERIAL*)lpMaterialBuffer->GetBufferPointer();

    // Fehler für Materialien und Texturen anlegen
    m_lpMeshMaterials = new D3DMATERIAL9[m_nNumMaterials];
    m_lpMeshTextures = new char*[m_nNumMaterials];

    // Materialien und Texturen kopieren
    for(int i=0;i<m_nNumMaterials;i++)
    {
       
        m_lpMeshMaterials[i] = lpMaterials[i].MatD3D;
        m_lpMeshMaterials[i].Ambient = m_lpMeshMaterials[i].Diffuse;
       
        // wenn Textur vorhanden
        if(NULL != lpMaterials[i].pTextureFilename)
        {
            m_lpMeshTextures[i] = new char[strlen(lpMaterials[i].pTextureFilename)+14+1];
   
            strcpy(m_lpMeshTextures[i],"../../media/x/");
            strcat(m_lpMeshTextures[i],lpMaterials[i].pTextureFilename);
   
            m_lpResManager->AddTexture(m_lpMeshTextures[i]);
        }
        else
        {
            m_lpMeshTextures[i] = NULL;
        }
    }

    return TRUE;
}


Es scheint irgendwo mit den Materialien zu tun zu haben glaub ich?!
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.10.2004, 14:20    Titel: Antworten mit Zitat

Naja fast würde ich sagen:

Code:
// Zeiger auf die verwendeten Materialien
    D3DXMATERIAL* lpMaterials = (D3DXMATERIAL*)lpMaterialBuffer->GetBufferPointer();

    // Fehler für Materialien und Texturen anlegen
    m_lpMeshMaterials = new D3DMATERIAL9[m_nNumMaterials];
    m_lpMeshTextures = new char*[m_nNumMaterials];

    // Materialien und Texturen kopieren
    for(int i=0;i<m_nNumMaterials;i++)
    {
       
        m_lpMeshMaterials[i] = lpMaterials[i].MatD3D;
        m_lpMeshMaterials[i].Ambient = m_lpMeshMaterials[i].Diffuse;
       
        // wenn Textur vorhanden
        if(NULL != lpMaterials[i].pTextureFilename)
        {
            m_lpMeshTextures[i] = new char[strlen(lpMaterials[i].pTextureFilename)+14+1];
   
            strcpy(m_lpMeshTextures[i],"../../media/x/");
            strcat(m_lpMeshTextures[i],lpMaterials[i].pTextureFilename);
   
            m_lpResManager->AddTexture(m_lpMeshTextures[i]); //Könnte hiermit was zu tun haben
        }
        else
        {
            m_lpMeshTextures[i] = NULL;
        }
    }
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 26.10.2004, 16:08    Titel: Antworten mit Zitat

Hm, wenn ich die Zeile aber zur Probe mal weglasse kack das Programm auch ab. Irgenwdie versteh ich das ganze ding nicht. Immerhin ist das wirklich 100% so wie im Buch und in den Beispielen beschrieben... Sad

Ansonsten könnte es ja nur am ResourceManager mit dem AddTexture scheitern. Das ist aber auch wie im Buch drin!?!

Code:

void CResourceManager::AddTexture(LPCSTR lpFileName)
{
    // testen, ob die Textur bereits vorhanden ist
    LPDIRECT3DTEXTURE9 lpTexture = GetTexture(lpFileName);

    // wenn sie nicht vorhanden ist, wird sie wie
    // gewohnt erzeugt
    if(!lpTexture)
    {
        D3DXIMAGE_INFO ImageInfo;
        D3DXGetImageInfoFromFile(lpFileName,&ImageInfo);

        D3DXCreateTextureFromFileEx(m_lpD3DDevice,
                                    lpFileName,
                                    ImageInfo.Width,
                                    ImageInfo.Height,
                                    1,0,
                                    D3DFMT_UNKNOWN,
                                    D3DPOOL_MANAGED,
                                    D3DX_FILTER_NONE,
                                    D3DX_FILTER_NONE,
                                    0,0,0,
                                    &lpTexture);

        // und in die Map unter ihrem Namen eingefügt
      m_MapTextures[lpFileName] = lpTexture;
   }
}

_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.10.2004, 16:13    Titel: Antworten mit Zitat

Warum steppst du nicht mal beim Debuggen durch den Code und findest die Stelle heraus an dem das Programm abkackt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 26.10.2004, 16:28    Titel: Antworten mit Zitat

Allen Anschein nach kackt er bei dieser Zeile ab:
D3DXMATERIAL* lpMaterials = (D3DXMATERIAL*)lpMaterialBuffer->GetBufferPointer();
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.10.2004, 16:30    Titel: Antworten mit Zitat

Dann prüfe mal ob lpMaterialBuffer in Ordnung ist. (simpel: if(!lpMaterialBuffer) return;)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 26.10.2004, 16:40    Titel: Antworten mit Zitat

Selbst dabei krampft er schon ab:
Code:

if(!lpMaterialBuffer)
{
   return FALSE;
}

Aber warum er das macht? Ich weiß es nicht.
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.10.2004, 16:46    Titel: Antworten mit Zitat

Steppe mal dahin und sage mir was er sagt wenn du den Ausdruck überwachen lässt von lpMaterialBuffer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.10.2004, 19:23    Titel: Antworten mit Zitat

Also ich wollte auch XFiles anzeigen, auch genau mit der Funktion, hatte aber immer Probleme. Die XFiles aus dem Buch funktionierten wunderbar, aber alle anderen nicht. Ich wollte mit Blender modelleiren, konnte er nicht laden. (LoadMeshFromXY schlug fehlmit dem Fehlercode, die Datei sei ungültig oder so).
Möglich das es daran liegt, da deine Problemzeile ja direkt dahinter liegt.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 26.10.2004, 19:54    Titel: Antworten mit Zitat

Hallo FallenAngel,

hab das jetzt eben mal gemacht.

ich hab das codemäßig jetzt so:
Code:

   D3DXLoadMeshFromX(xFile,
                    D3DXMESH_MANAGED,
                 m_lpD3DDevice,
                 NULL,
                 &lpMaterialBuffer,
                 NULL,
                 &m_nNumMaterials,
                 &m_lpMesh);

   if(!lpMaterialBuffer)
   {
      return FALSE;
   }


Beim &lpMaterialBuffer zeigt er mir beim ausführen diesen Wert an:
&lpMaterialBuffer 0x0012f8a4 "ÌÌÌÌÐZh"

bei lpMaterialBuffer in der if-Schleife das:
lpMaterialBuffer 0xcccccccc

da kann doch was nicht richtig sein...
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 06.11.2004, 10:31    Titel: Antworten mit Zitat

schreib doch mal einfache
Code:

if(FAILED(D3DXLoadMeshFromX())
{
//Fehlermeldung ausgeben
}


Solche ladefunktionen sollte man immer überprüfen, damit erspart man sich viel Arbeit. Ich mach die Ausgabeimmer in ne Date, wenns abgestürtzt ist seh ich dann direkt ob ne DX Funktion fehlgeschlagen ist.[/code]
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 06.11.2004, 16:50    Titel: Antworten mit Zitat

Es muss irgendwie am Resourcemangager liegen an der AddTexture Funktion.

Habe jetzt einmal das Beispiel von der DXSDK durchprobiert was XFiles läd und ohne die AddTexture Funktion in meine Anwendung eingearbeitet. Jetzt geht das laden ohne Probleme. Muss jetzt nur mal gucken wie ich die Texturen davon jetzt am besten verwalte.
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 07.11.2004, 17:49    Titel: Antworten mit Zitat

Wenn du denh RessourceManager vom Buch benutzt sollteste den mal vollstndig auf std:.string umstellen, damit hatte ich vorher auch so einige Probleme die damit schnell zu beheben waren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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