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. ^^