Probleme beim 2D Scrollen



  • hallo,

    ich bin neu hier und das ist mein erster Beitrag.
    Ich möchte gerne ein 2D Spiel programmieren, weil ich noch Anfänger bin.
    Das Programm soll einen Hintergrund laden und dann auf und ab scrollen.
    Das Problem besteht darin das ich nur einen dunkelen Bidschirm sehe.

    Hier ist nur Ausschnitt des Programms bei Bedarf kann ich noch mehr schicken.

    h-Datei
    #include <d3d9.h>
    #include <d3dx9.h>
    #include "global.h"
    
    class CDirect3D
    {
       public:
    
            CDirect3D();
            virtual ~CDirect3D();
    
            // Methoden zum Start/Beenden der Szene 
            void BeginScene(void);
            void EndScene(void);
    
             // Zeiger auf den Hintergrundbuffer zurückgeben
            LPDIRECT3DSURFACE9 GetBackbuffer(void);
    
       protected:
    
            // Farbe für den Backbuffer
            D3DCOLOR          m_ClearColor;
    
            // Direct3D Variablen
            LPDIRECT3D9       m_lpD3D;
            LPDIRECT3DDEVICE9 m_lpD3DDevice;
            LPD3DXFONT        m_lpD3DFont;
    
            LPDIRECT3DSURFACE9 m_lpBackBuffer;
            LPDIRECT3DSURFACE9 m_lpSurface;
    
            // Rechteck und Richtung für das Scrolling
            RECT r;
            int  m_ScrollDirection;
    
    cpp-Datei
    CDirect3D::CDirect3D()
    {
        m_lpD3D        = NULL;
        m_lpD3DFont    = NULL;
        m_lpD3DDevice  = NULL;
        m_lpBackBuffer = NULL;
        m_lpSurface    = NULL;
    
        // Richtung und Geschwindigkeit des Scrollings
        m_ScrollDirection = 1;
    
    }
    ...
        // Oberfläche für das Scrolling anlegen
        m_lpD3DDevice->CreateOffscreenPlainSurface(
                                          1024,768*2,
                                          D3DFMT_X8R8G8B8,
                                          D3DPOOL_DEFAULT,
                                          &m_lpSurface,
                                          0);
    
        // Rechteck für das Kopieren der Grafiken anlegen
    	r.left = 0;
    	r.top  = 0;
    	r.right = 956;
    	r.bottom = 1400;
        // erste Grafik laden
        D3DXLoadSurfaceFromFile(m_lpSurface,0,&r,
                                "Hintergrund/ImpelDown.png",
                                0,D3DX_DEFAULT,0,NULL);   
    
        // Rechteck für 2. Grafik festlegen und Grafik laden
    	r.top    += 700;
    	r.bottom += 700;
        D3DXLoadSurfaceFromFile(m_lpSurface,0,&r,
                                "Hintergrund/ImpelDown.png",
                                0,D3DX_DEFAULT,0,NULL);   
    
        // Zeiger auf dem Hintergrundpuffer holen
        m_lpD3DDevice->GetBackBuffer(0,0,
                                     D3DBACKBUFFER_TYPE_MONO,
                                     &m_lpBackBuffer);
    
    // Methoden zum Start/Beenden der Szene 
    void CDirect3D::BeginScene(void)
    {
        m_lpD3DDevice->BeginScene();
    
        // aktuellen Bereich in den Backbuffer kopieren
        m_lpD3DDevice->StretchRect(m_lpSurface,
                                   &r,
                                   m_lpBackBuffer,
                                   0,
                                   D3DTEXF_NONE);
    
    }
    
    void CDirect3D::EndScene(void)
    {
        m_lpD3DDevice->EndScene();
    
        m_lpD3DDevice->Present(0,0,0,0);
    }
    
    main.cpp
    
    // Instanz der Klasse CDirect3D
    CDirect3D Direct3D;
    
    // Windows main-Funktion
    int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                       HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                       LPSTR lpCmdLine,          // Kommandozeile
                       int nCmdShow)             // Art wie das Fenster angezeigt werden soll
    {   
        // Fenster erzeugen und Handle speichern
        hWnd = CreateMainWindow(hInstance);
    
        // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
        if(0 == hWnd)
        {
            MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
            return -1;
        }
    
        // Maus-Cursor verstecken
        ShowCursor(FALSE);
    
        // Direct3D initialisieren
        if(!Direct3D.Init(hWnd,FALSE))
        {
            return -1;
        }
    
        // Farbe die beim Löschen verwendet werden soll
    
    	// Struktur, in der Informationen zur Nachricht gespeichert werden
        MSG msg = { 0 };
    
        while(msg.message != WM_QUIT)
        {
            if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                Direct3D.BeginScene();
                Direct3D.EndScene();
            }
        }
    
        // Rückgabewert an Windows
        return 0;
    }
    

    Ich bedanke mich schon mal

    Viele Grüße
    eVel



  • Flipst du irgendwo Front- und Backbuffer nach dem rendern? Bzw. benutzt du ueberhaupt Double Buffering?



  • Also im gesamten Programm gibts nur 2 Oberflächen

    LPDIRECT3DSURFACE9 m_lpBackBuffer;
    LPDIRECT3DSURFACE9 m_lpSurface;

    in m_lpSurface wird der Hintergrund geladen und dann in m_lpBackBuffer kopiert



  • Naja, wenn der Terminus stimmt, dann hoert sich das fuer mich an, als wuerde im Frontbuffer nie was auftauchen. ^^ Unter nem Backbuffer verstehe ich zumindest einen beschreibbaren Speicherbereich, der gerade nicht zum anzeigen des Bildes verwendet wird. Tut mir Leid falls ich da etwas falsch interpretiert haben sollte. Ich bin eher auf der OpenGL-Schiene unterwegs und nicht sonderlich bewandert mit DX. Aber ich dachte ich poste mal, bevor niemand etwas schreibt. ^^


Anmelden zum Antworten