Bilder verschwinden nach einer gewissen Zeit



  • Hi

    Ich habe ein Programm.... Dieses funktioniert einwandfrei (in den ersten 20-30sekunden) Danach verschwinden plötzlich die Bilder... (Nur die Texte welche ich ausgebe sind noch vorhanden) Woran könnte dies liegen?

    Hier der Quelltextausschnitt:

    while(msg.message != WM_QUIT)
    	{    
            if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {  
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                Direct3D.BeginScene();
    			Direct3D.DrawText("Gismo Kontroll-Center",245,10,D3DCOLOR_XRGB(0,0xFF,100));
    
    			Direct3D.navigation(programmpfad+forward[i_foward]+".png",380,130);
    			Direct3D.navigation(programmpfad+backward[i_backward]+".png",380,375);
    			Direct3D.navigation(programmpfad+right[i_right]+".png",570,245);
    			Direct3D.navigation(programmpfad+left[i_left]+".png",150,245);
    			Direct3D.EndScene();
    
            }
        }
    

    Dies ist die funktion navigation:

    bool CDirect3D::navigation(LPCSTR filename, int x, int y)
    {
    	   // Initialisierung
        LPD3DXSPRITE       lpSprite        = NULL;
        LPDIRECT3DDEVICE9  lpD3DDevice     = NULL;   
        LPDIRECT3DTEXTURE9 lpSpriteTexture = NULL;
    
        // Neue Methode der CDirect3D-Klasse
        lpD3DDevice = m_lpD3DDevice;
    
        // Textur laden, FILE_NAME enthält den Dateinamen
        D3DXCreateTextureFromFile(lpD3DDevice,
                                  filename,
                                  &lpSpriteTexture);
    
        // Sprite kreiern
        D3DXCreateSprite(lpD3DDevice,&lpSprite);
    
    	 // Zeichnen des Sprites
    
                // Sprite soll nicht skaliert werden
                D3DXVECTOR2 vScaling(1.0f, 1.0f);
    
                // Punkt, um den das Sprite gedreht werden soll
                D3DXVECTOR2 vRotationCenter(128.0f, 128.0f);
    
                // Sprite soll nicht rotiert werden
                float Rotation = 0.0f;
    
                // Sprite soll an Position 250, 250 gezeichnet werden
                D3DXVECTOR2 vPosition((float)x, (float)y);
    
                // Farben der Textur sollen nicht verändert werden
                D3DCOLOR ModulateColor = 0xFFFFFFFF;
    
                // Sprite zeichnen
                lpSprite->Draw(lpSpriteTexture,
                               NULL,
                               &vScaling,
                               &vRotationCenter,
                               Rotation,
                               &vPosition,
                               ModulateColor);
    
    			return true;
    }
    

    sieht jemand einen Fehler oder durch was könnte dies ausgelöst werden?
    Habe es bereits auf verschiedenen Rechnern ausprobiert... Fehler kommt immer zwischen 20 und 30 Sekunden....

    Vielen Dank für die Antworten!



  • Kann es sein, dass du in jedem Frame eine neue Textur erstellst, die du nicht freigibst=



  • Ich mache einfach genau, das, was im 1. Post zu sehen ist...

    Wie gebe ich diese dann wieder frei? oder wie verwende ich die gleiche wieder?



  • Machs genauso, wie auch mit Device-Pointer.
    Die Textur woanders erstellen und die Pointer als Membervariable in CDirect3D behalten.

    // Neue Methode der CDirect3D-Klasse 
        lpD3DDevice = m_lpD3DDevice;
    

    Das Kommentar ist übrigens irreführend. Du erstellst nichts neues, und schon gar keine Methode.
    Außerdem diese Zuweisung IMHO unnütz, da du weder lpD3DDevice veränderst und in diesem Scope auch zugriff auf m_lpD3DDevice hast.



  • Ich habe das ganze aus einem Beispiel 😞
    🙄 😞
    Aus diesem Grund sind die Kommentare nicht der Hammer! 😉
    Wie kann ich den die "Texturen" behalten? Ich erstelle diese ja alle mit der gleichen Funktion...

    Ein Beispiel wäre nicht schlecht... 😉
    Vielen Dank!



  • RTFM

    Bye, TGGC (Wähle deine Helden)



  • Da ist das ganze für mich überhaupt nicht verständlich erklährt und es hat in meinem Buch kein Beispiel dazu!



  • Dann heul doch.

    Bye, TGGC (Wähle deine Helden)



  • Wer Spieleprogrammieren will, oder allgemein Programme entwickelt, sollte logisch Denken können. Ich glaube das kann man von einem Softwareentwickler erwarten. Du hast von den Leuten hier einen Hinweis auf eine Fehlerquelle bekommen. Der Rest ist deine Arbeit.

    cu


  • Mod

    addict schrieb:

    Da ist das ganze für mich überhaupt nicht verständlich erklährt und es hat in meinem Buch kein Beispiel dazu!

    wenn dich das ein wenig überfordert, dann lass dir zeit und lern erstmal vernünftig c++, dann wirst du viel schneller probleme wie z.b. "wie allokiere und verwalte ich resourcen richtig" lösen können.
    so kommst du später auch mit dem coden klar mit nur der docu und musst dich nicht durch bücher kämpfen.

    rapso->greets();



  • Ich kann bereits C++ allerdings habe ich mich bis jetzt nur mit MFC-Klassen und QT beschäftigt!


  • Mod

    Wie kann ich den die "Texturen" behalten? Ich erstelle diese ja alle mit der gleichen Funktion...

    wieso kannst du dann einen einfachen zeiger nicht ordentlich verwalten?

    rapso->greets();



  • Ich kann Zeiger verwalten hatte aber keine Ahnung wie ich eine Textur anlegen muss!



  • addict schrieb:

    Ich kann bereits C++

    Ah so.

    Bye, TGGC (Keine Macht den Dummen)


Anmelden zum Antworten