GDI+ "Backpuffer" Problem

  • Hallo,


    ich habe ein problem mit dem "Backpuffer".


    Will nähmlich, da ich noch ein anfänger bin, das Spiel PingPong nachbauen. Nichts aufwendiges, nur um die basics von GDI+ zu verstehen.


    So nun zum problem:


    das Programm erzeugt den Ball, löscht Ihn aber nicht mehr.


    habe das Programm auf Grundlage eines Tutorials programmiert, habe deswegen auch noch einige fragen zu gewissen Funktionen. Darauf würde ich aber später nochmal genauer eingehen.


    Außerdem hat das programm eine CPU-Auslastung von 25% (bei einem 4-kern)


    Könnt Ihr bitte mal schauen was da nicht stimmt.

    Vllt habt Ihr auch noch Tipps wie ich den Code minimieren kann oder auch verbessern.

    Danke


    Spoiler anzeigen

    ]

  • Hi,
    ich habs mal zum laufen gebracht.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>
    #include <Misc.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $dll = DllOpen("user32.dll")
    _GDIPlus_Startup()
    Global $GuiBreite = 400, $GuiHoehe = 400 ;GuiGröße
    Global $BallBreite = 10, $BallHoehe = 10 ;Größe des Balles
    Global $WPos = ($GuiBreite / 2) - ($BallBreite / 2), $HPos = ($GuiHoehe / 2) - ($BallHoehe / 2) ;Starposition für Ball
    Global $back = "True", $Down = "True" ;Für das automatische zurückhüpfen des balles
    Global $GeschBreite = 0.07, $GeschHoehe = 0.06 ;Wie weit/Schnell der Ball sich bewegt

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("Shutdown_GDI") ;Führt die funktion aus, sobald das Prog beendet wird

    [/autoit] [autoit][/autoit] [autoit]

    $MainGUI = GUICreate("Game", $GuiBreite, $GuiHoehe) ;hauptfenster wird erzeugt
    GUISetOnEvent(-3, "Shutdown_GDI")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    $Graphics = _GDIPlus_GraphicsCreateFromHWND($MainGUI) ;Grafische Oberfläche wird erzeugt
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics($GuiBreite, $GuiHoehe, $Graphics)
    $Backbuffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)

    [/autoit] [autoit][/autoit] [autoit]

    $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ GUIRegisterMsg($WM_PAINT, "WM_PAINT") ;Funktion mir noch nicht genau bekannt (War in ner Tut so drin :) )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    _GDIPlus_GraphicsFillRect($Backbuffer, 0, 0, $GuiBreite, $GuiHoehe, $hBrush)
    _GDIPlus_GraphicsDrawArc($Backbuffer, $WPos, $HPos, $BallBreite, $BallHoehe,180,360)
    _GDIPlus_GraphicsDrawImage($Graphics, $Bitmap, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    BallMoveW()
    BallMoveH()

    [/autoit] [autoit][/autoit] [autoit]

    ;~ sleep(1)
    If _IsPressed("28", $dll) Then
    $HPos = $HPos + 2
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If _IsPressed("26", $dll) Then
    $HPos = $HPos - 2
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If _IsPressed("27", $dll) Then
    $WPos = $WPos + 2
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If _IsPressed("25", $dll) Then
    $WPos = $WPos - 2
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    PosTestBreite()
    PosTestHoehe()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;Funktionen--------------------------------------------------------------------------------------
    ;~ Func WM_PAINT()
    ;~
    ;~ _GDIPlus_GraphicsDrawImageRect($Table,$Testbild,0,0,$GuiBreite,$GuiHoehe)
    ;~ Return $GUI_RUNDEFMSG
    ;~ EndFunc ;==>WM_PAINT

    [/autoit] [autoit][/autoit] [autoit]

    Func BallMoveH()
    If $HPos = $GuiHoehe - $BallHoehe Then
    $Down = "True"
    EndIf
    If $HPos = 0 Then
    $Down = "False"
    EndIf
    If $Down = "True" Then
    $HPos = $HPos - $GeschHoehe
    EndIf
    If $Down = "False" Then
    $HPos = $HPos + $GeschHoehe
    EndIf
    EndFunc ;==>BallMoveH

    [/autoit] [autoit][/autoit] [autoit]

    Func BallMoveW()
    If $WPos = $GuiBreite - $BallBreite Then
    $back = "True"
    EndIf
    If $WPos = 0 Then
    $back = "False"
    EndIf
    If $back = "True" Then
    $WPos = $WPos - $GeschBreite
    EndIf
    If $back = "False" Then
    $WPos = $WPos + $GeschBreite
    EndIf
    EndFunc ;==>BallMoveW

    [/autoit] [autoit][/autoit] [autoit]

    Func PosTestBreite()
    If $WPos > $GuiBreite - $BallBreite Then
    $WPos = $GuiBreite - $BallBreite
    EndIf
    If $WPos < 0 Then
    $WPos = 0
    EndIf
    EndFunc ;==>PosTestBreite

    [/autoit] [autoit][/autoit] [autoit]

    Func PosTestHoehe()
    If $HPos > $GuiHoehe - $BallHoehe Then
    $HPos = $GuiHoehe - $BallHoehe
    EndIf
    If $HPos < 0 Then
    $HPos = 0
    EndIf
    EndFunc ;==>PosTestHoehe

    [/autoit] [autoit][/autoit] [autoit]

    Func Shutdown_GDI()
    _GDIPlus_GraphicsDispose($Graphics)
    _GDIPlus_GraphicsDispose($Backbuffer)
    _GDIPlus_BitmapDispose($Bitmap)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>Shutdown_GDI

    [/autoit]
  • Hab ich dadruch diesen "Backpuffer" um später flackernde Objekte zu vermeiden?

    Außerdem bewegt sich der Ball bisle "ruckartig". Wie als ob die Schleife plötzlich nen längere "Nachdenkzeit" brächte :)


    Kann man das auch fixen oder würdet Ihr lieber sagen: NEU MACHEN

    ??


    Danke schonmal

  • Aber ihr bei AutoIT.de habt doch sogar DoodleJump zum laufen gebracht....da ruckelt bestimmt auch nix und es wird gdi verwendet?!?


    Wie wurde das denn umgesetzt?

  • Die neuste Version meines Games.

    Denke man kann da noch einiges verkleinern, verbessern...

    Außerdem hab ich noch ein großes problem.

    Sprengers Code funktioniert zwar, aber wenn der ball sich bewegt wird ein weißer Streifen dargestellt, da wo der ball war.

    Kann man das vllt noch verbessern??

    Danke :)

    Spoiler anzeigen