Problem bei Bewegungsabläufen
-
Hallo Leute,
ich will ein 2D-Spiel(eine Art jump&run) programmieren. Nun habe ich ein Problem bei den Bewegungsabläufen. Ich erzeuge ein Bild, lösche es und lass ein neues Bild anzeigen.(Ich glaube dies ist auch die übliche Weise für Bewegungen).
Nun habe ich ein Problem beim Löschen des Bildes durch InvalidateRect().
Anstatt nur ein Bild zu löschen, wird gleich der ganze Fensterinhalt gelöscht.
Ich besitze Visual C++ 6.0.
Der betrefende Quellcodeausschnitt sieht so aus:void CMeinDlg::OnPaint()
{
Bild[0].LoadBitmap(IDB_BITMAP2); //CBitmap-ObjektCPaintDC dc(this); // Gerätekontext für Zeichnen
CPaintDC* pDC = &dc;
BITMAP bmBackground; //BITMAP-Struktur bm deklarieren
Bild[0].GetObject(sizeof(bmBackground),&bmBackground);
CBitmap Bild[0] --> BITMAP bm
CDC memDC;
memDC.CreateCompatibleDC(pDC); //SpeicherDC initialisieren
memDC.SelectObject(&Bild[0]); //Hintergrundbild --> Speicher
RECT Rect;
GetClientRect(&Rect);
pDC->StretchBlt(0,0,Rect.right,Rect.bottom,&memDC,0,0,
bmBackground.bmWidth,bmBackground.bmHeight,SRCCOPY);
CDialog::OnPaint();Bild[1].LoadBitmap(IDB_BITMAP5); //CBitmap-Objekt
Bild[2].LoadBitmap(IDB_BITMAP4); //CBitmap-Objektint nXDest=50;
int nYDest=100;
int b=2;BITMAP bm;
Bild[b].GetObject( sizeof( bm ), &bm );
CDC SpeicherDC;
SpeicherDC.CreateCompatibleDC( &dc );
SpeicherDC.SelectObject( &Bild[b] );
CRect Rect2;
GetClientRect( &Rect2 );
dc.SetStretchBltMode( HALFTONE );
dc.StretchBlt( 0, 0, Rect2.right, Rect2.bottom, &SpeicherDC,
0, 0, bm.bmWidth, bm.bmHeight, SRCAND );InvalidateRect(&Rect2, TRUE); /// Hier Problem? Oder Falsch
Könnt ihr mir vieleicht helfen und eine Lösung für das oben genannte Problem
posten?
Schon mal vielen Dank!Gruß Mr.X
-
Wenn du die Code-tags (C/C++) hernimmst, kann man es besser lesen (gleich unter den Smilies ;)).
-
normalerweise mußt du das bild nicht extra löschen. am einfachsten ist es, wenn du deine szene in einem backbuffer erstellst und diesen dann auf dein fenster zeichnest.dabei überschreibst du einfach den fensterinhalt.
-
Erst einmal Danke für die Antworten, aber nun zu dir mac_bu:
Wie hast du dir den deine Lösung vorgestellt? Ich kann doch nicht für jeden erdenklichen Fleck auf den sich meine Spielfigur befindet eine eigene Bitmap zeichnen! Oder habe ich dich falsch verstanden?So und für dich AJ ist hier noch einmal der Quellcode im Code-tag:
void CMeinDlg::OnPaint()
{
Bild[0].LoadBitmap(IDB_BITMAP2); //CBitmap-ObjektCPaintDC dc(this); // Gerätekontext für Zeichnen
CPaintDC* pDC = &dc;
BITMAP bmBackground; //BITMAP-Struktur bm deklarieren
Bild[0].GetObject(sizeof(bmBackground),&bmBackground);
CBitmap Bild[0] --> BITMAP bm
CDC memDC;
memDC.CreateCompatibleDC(pDC); //SpeicherDC initialisieren
memDC.SelectObject(&Bild[0]); //Hintergrundbild --> Speicher
RECT Rect;
GetClientRect(&Rect);
pDC->StretchBlt(0,0,Rect.right,Rect.bottom,&memDC,0,0,
bmBackground.bmWidth,bmBackground.bmHeight,SRCCOPY);
CDialog::OnPaint();Bild[1].LoadBitmap(IDB_BITMAP5); //CBitmap-Objekt
Bild[2].LoadBitmap(IDB_BITMAP4); //CBitmap-Objektint nXDest=50;
int nYDest=100;
int b=2;BITMAP bm;
Bild[b].GetObject( sizeof( bm ), &bm );
CDC SpeicherDC;
SpeicherDC.CreateCompatibleDC( &dc );
SpeicherDC.SelectObject( &Bild[b] );
CRect Rect2;
GetClientRect( &Rect2 );
dc.SetStretchBltMode( HALFTONE );
dc.StretchBlt( 0, 0, Rect2.right, Rect2.bottom, &SpeicherDC,
0, 0, bm.bmWidth, bm.bmHeight, SRCAND );InvalidateRect(&Rect2, TRUE); /// Hier Problem? Oder Falsch
Bitte helft mir!
Gruß Mr.X