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-Objekt

    CPaintDC 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-Objekt

    int 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-Objekt

    CPaintDC 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-Objekt

    int 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


Anmelden zum Antworten