Movement ohne Flackern

  • Hey,
    ich arbeite gerade an einem Rollenspiel.
    Hier ist die Bewegung wenn der Typ sich bewegt:

    [autoit]


    Func walk_right()
    If $action = False Then
    $action = True
    $p_x += 10
    GUICtrlDelete($player)
    $player = GUICtrlCreatePic("./poses/walk_right_right.gif", $p_x, $p_y, 24, 62)
    GUICtrlSetState($player, $WS_EX_TOPMOST)
    $p_x += 10
    Sleep(100)
    GUICtrlDelete($player)
    $player = GUICtrlCreatePic("./poses/walk_right_left.gif", $p_x, $p_y, 24, 62)
    GUICtrlSetState($player, $WS_EX_TOPMOST)
    Sleep(100)
    GUICtrlDelete($player)
    $player = GUICtrlCreatePic("./poses/stand_right.gif", $p_x, $p_y, 24, 62)
    GUICtrlSetState($player, $WS_EX_TOPMOST)
    $stand = "right"
    $action = False
    Else
    Return
    EndIf
    EndFunc

    [/autoit]

    Das Problem: Es flackert. Vorallem wenn ich einen Hintergrund habe.
    Gibt es eine Lösung dazu? Mit GDI+ komme ich Null klar und mit GuiCtrlSetPos kann ich in diesem Fall nichts anfangen.
    Mfg

  • bei mir geht "Guictrlsetpos"

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $pos=0
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 301, 37, 192, 124)
    $Pic1 = GUICtrlCreatePic(@ScriptDir&"\test.bmp", 0, 0, 41, 33)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Sleep (100)
    $pos+=5
    GUICtrlSetPos($Pic1,$pos,0,41,33)
    If $pos = 300 Then $pos = 0
    WEnd

    [/autoit]

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Nein, das wird nicht funktionieren...
    Er hat ja andere Bilder zb. wenn das Männchen steht, und bei dir ist es ja immer das selbe Bild;)

    lg chess

    PS: Natürlich flackert es, es wird ja jedesmal das Bild neu geladen ;)
    Wenn man vll alle Bilder direkt generiert und wirklich nur die Position verändert, und ein bestimmtes aber immer in den Vordergrund holt? Ich weiß nicht, ob bei GuiCtrlSetPos das Bild neu geladen wird...

  • Hi,

    so besser ?

    Spoiler anzeigen
    [autoit]


    ; Dem Hauptfenster diesen erweiterten Style mitgeben
    GUICreate ("Hauptfenster", [...], $WS_EX_COMPOSITED)

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

    Func walk_right($uidPlayer)

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

    If $action = False Then
    $action = True
    GUICtrlSetState ($uidPlayer, $GUI_ONTOP)
    GUICtrlSetImage ($uidPlayer, "./poses/walk_right_right.gif")
    For $i = 1 To 10
    $p_x += $i
    GUICtrlSetPos ($uidPlayer, $p_x, $p_y, 24, 62)
    Sleep(10)
    Next
    GUICtrlSetImage ($uidPlayer, "./poses/walk_right_left.gif")
    For $i = 1 To 10
    $p_x += $i
    GUICtrlSetPos ($uidPlayer, $p_x, $p_y, 24, 62)
    Sleep(10)
    Next
    GUICtrlSetImage ($uidPlayer, "./poses/stand_right.gif")
    $stand = "right"
    $action = False
    Else
    Return
    EndIf
    EndFunc

    [/autoit]

    Gruß
    Greenhorn


  • Benutz doch GDI+. Ich denke mal das ist wesentlich schneller. Evtl muss man die ganzen Positionen immer speichern, aber es rentiert sich. Tuts findest du über Google und genug Beispiele hier im Forum ;)

  • Greenhorn so funktioniert das ganz gut, allerdings verschwindet das Männchen wenn ich ein bild als hintergrund setze :/
    Bzw. wenn das Männchen vor ein Haus läuft, ist das Haus im vordergrund, selbst mit Guictrlsetstate(player, WS_EX_TOPMOST)

    Einmal editiert, zuletzt von Nakroma (17. März 2012 um 11:38)