wxWidgets: Vorgehensweise



  • Hallo Allerseits,

    Ich bin gerade dabei mit wxWidgets ein kleines Ball-Spiel zu schreiben. Nun bin ich mir aber nicht klar wie die Vorgehensweise sein muss.

    Das Spiel besteht, technisch gesehen, aus mehreren Teilen:

    ) Ein _Schläger_ der dann verschoben wird wenn die Maus über den Frame bewegt wird.
    ) Ein Ball der mittels Timer über den Frame bewegt wird.
    ) Dann sind noch andere Teile (sozusagen Steine, _Löcher_) die statisch im Frame angeordnet werden.

    Ich hab hier den Knopf im Kopf das ich mit den DC's nicht zusammenkomme: Wann nehme ich wxPaintDC, wann wxClientDC. Brauche ich auch einen wxEraseEvent behandeln?

    So wie ich das jetzt mache wird der Ball zwar weiter geschoben aber der Hintergrund nicht gelöscht.

    Wie bekomme ich den Hintergrund an der aktuellen Position (x,y, breite, höhe) vor dem Zeichnen des Balls um ihn dann wenn er weitergeschoben wurde wieder zurückzusetzen.

    Ich hoffe ich hab mich klar genug ausgedrückt.

    Danke,
    Reinhard



  • Ich würde dir raten auf den EraseBackground-Event zu verzichten wann immer du kannst, weil das nur zu flackern führt.

    Meine Empfehlung wäre: Zeichne deinen Kram in eine Bitmap und blitte diese dann in den Frame. So bekommst du eine flickerfreie Darstellung. Den Erase-Event implementierst du, lässt ihn aber leer, so dass er gar nichts macht (sonst macht es der Default-Handler).

    Was wxPaintDC und wxClientDC angewht: wxPaintDC wird ausshcliesslich im Paint-Event verwendet. wxClientDC kannst du jederzeit verwenden. Wenn du also nicht gerade regelmässig per Refresh() dafür sorgst, dass dein Paint-Handler aufgerufen wird, dürfte für dich wohl eher der wxClientDC in Frage kommen.

    Falls du Refresh() verwenden solltest, kannst du in deinem Paint-Handler auch einen wxBufferedPaintDC verwenden. Der nimmt der das Rumhantieren mit der Bitmap ab. Soll heissen er zeichnet für dich alles in eine Bitmap und blittet diese beim Zerstören des DC in den Frame.



  • [quote="frenki"]Ich würde dir raten auf den EraseBackground-Event zu verzichten wann immer du kannst, weil das nur zu flackern führt.

    Meine Empfehlung wäre: Zeichne deinen Kram in eine Bitmap und blitte diese dann in den Frame. So bekommst du eine flickerfreie Darstellung. Den Erase-Event implementierst du, lässt ihn aber leer, so dass er gar nichts macht (sonst macht es der Default-Handler).

    Was wxPaintDC und wxClientDC angewht: wxPaintDC wird ausshcliesslich im Paint-Event verwendet. wxClientDC kannst du jederzeit verwenden. Wenn du also nicht gerade regelmässig per Refresh() dafür sorgst, dass dein Paint-Handler aufgerufen wird, dürfte für dich wohl eher der wxClientDC in Frage kommen.

    Falls du Refresh() verwenden solltest, kannst du in deinem Paint-Handler auch einen wxBufferedPaintDC verwenden. Der nimmt der das Rumhantieren mit der Bitmap ab. Soll heissen er zeichnet für dich alles in eine Bitmap und blittet diese beim Zerstören des DC in den Frame.[/quote]

    Hallo frenki,

    Also irgendwie hab ich das Ganze nicht so richtig verstanden:
    EreaseBackground: wenn ich den zwar implementiere aber leer lasse dann ist der Hintergrund zerstört. Gibt es noch einen Erease-Event?
    Ein event.Skip() eingefügt oder ganz weggelassen und das Fenster wird normal dargestellt. Aber wenn ich mit der Maus den Schläger verschiebe dann flackert der Ball.

    Außerdem habe ich noch das Problem das der Hintergrund vom Ball nicht zurückgesetzt wird.

    Gibts dyazu vielleicht ein paar Code snippets?

    Danke,
    Reinhard


  • Mod

    Gibt nur einen Tipp, den ich dir da geben kann, lass es bleiben.
    Animationen dieser art sind nicht die Stärke von GUI Toolkits.
    Verwende für Spieleprogrammierung lieber OpenGL oder DX.
    Mit wxWidgets kann man aber auch Spiele machen, Brettspiele z.B.

    phlox


Anmelden zum Antworten