GDIPlus Ebene erstellen ?

  • Hallo Leute,
    Ich bin gerade dabei ein eigenes Spiel zu Programmieren, welches sich noch in der frühesten Anfangsphase befindet
    Das Spiel kann eine txt Datei Lesen und diese in eine Map im Spiel umwandeln.
    Diese Map soll auf eine eigene "Ebene" gezeichnet werden, sodass ich sie verschieben kann und immer direkt die
    Map auf einmal zeichnen kann. Bitte nicht erschrecken... der Skript ist Ziemlich unstrukturiert und schlecht geschrieben d.h es
    liegen noch Fehler vor im sinne von unnötigen Zeilen.
    Nun seht selbst :

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <File.au3>

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

    $hGui = GUICreate("Heart-Eater", 513, 513)
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    $char = _GDIPlus_ImageLoadFromFile(@Scriptdir & "\data\char\char.png")
    $schatten = _GDIPlus_ImageLoadFromFile(@Scriptdir & "\data\char\schatten.png")
    $hintergrund = _GDIPlus_ImageLoadFromFile(@scriptdir & "\data\hintergrund.png")
    $SPS = _GDIPlus_ImageLoadFromFile(@scriptdir&"\data\kachelspritesheet.png")

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

    $hGr_Frontbuffer = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    $hBitmap_Backbuffer = _GDIPlus_BitmapCreateFromGraphics(600, 600, $hGr_Frontbuffer)
    $hGr_Backbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap_Backbuffer)
    $hGr_Map = _GDIPlus_ImageGetGraphicsContext($hBitmap_Backbuffer)

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

    $BEWEG_SPEED = 50
    $BEWEG_RICHTUNG = 1
    $y = 0
    Global $aArray
    Local $mX, $mY
    $MAPY = 2000
    $MAPX = 2000

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

    ;===== HAUPTSCHLEIFE =========

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

    FullsAni()
    _openmap()

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

    While 1
    $nMsg = GUIGetMsg()
    If $nMsg = -3 Then Exit
    If _IsPressed(57) Or _IsPressed(26) Then
    FullwAni()
    EndIf ; w
    If _IsPressed(41) Or _IsPressed(25) Then
    FullaAni()
    EndIf ; a
    If _IsPressed(53) Or _IsPressed(28) Then
    FullsAni()
    EndIf ; s
    If _IsPressed(44) Or _IsPressed(27) Then
    FulldAni()
    EndIf ; d
    If _IsPressed(10) Then
    $BEWEG_SPEED = 10
    Else
    $BEWEG_SPEED = 50
    EndIf
    WEnd

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

    ;====== BEWEGUNGS-RICHTUNGEN ========

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

    Func FullwAni()
    wAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    For $y = 0 To 128 Step 16
    $mY += 4
    _GDIPlus_GraphicsClear($hGr_Backbuffer,0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,32,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 1
    EndFunc

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

    Func FullaAni()
    aAnimaD()
    If $BEWEG_RICHTUNG = 2 Then
    For $y = 0 To 128 Step 16
    $mX += 4
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,48,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 2
    EndFunc

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

    Func FullsAni()
    sAnimaD()
    If $BEWEG_RICHTUNG = 3 Then
    For $y = 0 To 128 Step 16
    $mY -= 4
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,0,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 3
    EndFunc

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

    Func FulldAni()
    dAnimaD()
    If $BEWEG_RICHTUNG = 4 Then
    For $y = 0 To 128 Step 16
    $mX -= 4
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,16,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 4
    EndFunc

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

    ;====== BEWEGUNGS-DREUNGEN ========

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

    Func dAnima()
    If $BEWEG_RICHTUNG < 4 Then
    For $i = 128 To 192 Step 16
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $i,0,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep(20)
    Next
    EndIf
    EndFunc

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

    Func wAnima()
    If $BEWEG_RICHTUNG > 1 Then
    For $i = 128 To 192 Step 16
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $i,16,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep(20)
    Next
    EndIf
    EndFunc

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

    Func aAnima()
    If $BEWEG_RICHTUNG = 1 Or $BEWEG_RICHTUNG = 3 Or $BEWEG_RICHTUNG = 4 Then
    For $i = 128 To 192 Step 16
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $i,32,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep(20)
    Next
    EndIf
    EndFunc

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

    Func sAnima()
    If $BEWEG_RICHTUNG = 1 Or $BEWEG_RICHTUNG = 2 Or $BEWEG_RICHTUNG = 4 Then
    For $i = 128 To 192 Step 16
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $i,48,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep(20)
    Next
    EndIf
    EndFunc

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

    Func wAnimaD()
    If $BEWEG_RICHTUNG = 2 Then
    sAnima()
    dAnima()
    wAnima()
    EndIf
    If $BEWEG_RICHTUNG = 3 Then
    dAnima()
    wAnima()
    EndIf
    If $BEWEG_RICHTUNG = 4 Then
    wAnima()
    EndIf
    EndFunc

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

    Func aAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    aAnima()
    EndIf
    If $BEWEG_RICHTUNG = 3 Then
    dAnima()
    wAnima()
    aAnima()
    EndIf
    If $BEWEG_RICHTUNG = 4 Then
    wAnima()
    aAnima()
    EndIf
    EndFunc

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

    Func sAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    aAnima()
    sAnima()
    EndIf
    If $BEWEG_RICHTUNG = 2 Then
    sAnima()
    EndIf
    If $BEWEG_RICHTUNG = 4 Then
    wAnima()
    aAnima()
    sAnima()
    EndIf
    EndFunc

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

    Func dAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    aAnima()
    sAnima()
    dAnima()
    EndIf
    If $BEWEG_RICHTUNG = 2 Then
    sAnima()
    dAnima()
    EndIf
    If $BEWEG_RICHTUNG = 3 Then
    dAnima()
    EndIf
    EndFunc

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

    Func openmap()
    _GDIPlus_GraphicsDrawImage($hBitmap_Backbuffer, $hGr_Map, 0, 0)
    EndFunc

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

    Func _openmap()
    Local $aArray[1]
    _FileReadToArray(@ScriptDir&"\maps\sclucht.map",$aArray)
    For $x = 1 To $aArray[0] Step 1
    $ss = StringSplit($aArray[$x]," ")
    $q = StringSplit($ss[2],";")
    If $ss[1] = "Gras" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,0,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Gravel" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,32,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Stein" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,64,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Wasser" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRL" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,160,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRR" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,192,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,224,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,256,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserELO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,32,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserELU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,64,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserERO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,128,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserERU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,96,32,32,$q[2],$q[2],32,32)
    EndIf
    Next
    EndFunc

    [/autoit]

    Über Hilfe würde ich mich sehr freuen ! :thumbup:

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Ich bin mir nicht ganz sicher was du meinst. Ich kann mit dem Begriff "Ebenen" im Zusammenhang mit GDIPlus nicht wirklich etwas anfangen.
    Falls ich dich richtig verstehe, suchst du eine Art zusätzlichen Buffer für die Map. In diesem Fall könntest du einfach eine zusätzliche Bitmap anlegen und mit ImageGetGraphicsContext bearbeiten. Diese Bitmap kannst du verändern und auf den Backbuffer zeichnen ohne, dass du diese Veränderungen jedes mal neu zeichnen musst.

  • Ja ihr habt recht,
    Es scheint zu Funktionieren doch leider entsteht ein übeles Flackern zwischen der Map und dem Char.
    Ich glaube es wird durch das resetten der Buffer ausgelöst doch ich weis nicht wie ich das in den Griff
    bekomme... :S

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <File.au3>

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

    $hGui = GUICreate("Heart-Eater", 513, 513)
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    $char = _GDIPlus_ImageLoadFromFile(@Scriptdir & "\data\char\char.png")
    $schatten = _GDIPlus_ImageLoadFromFile(@Scriptdir & "\data\char\schatten.png")
    $SPS = _GDIPlus_ImageLoadFromFile(@scriptdir&"\data\kachelspritesheet.png")

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

    $hGr_Frontbuffer = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    $hBitmap_Backbuffer = _GDIPlus_BitmapCreateFromGraphics(1, 1, $hGr_Frontbuffer)
    $hGr_Backbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap_Backbuffer)

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

    $Map_Backbuffer = _GDIPlus_BitmapCreateFromGraphics(600,600,$hGr_Frontbuffer)
    $hGr_Map = _GDIPlus_ImageGetGraphicsContext($Map_Backbuffer)

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

    $BEWEG_SPEED = 50
    $BEWEG_RICHTUNG = 1
    $y = 0
    Global $aArray
    Local $mX, $mY
    $MAPY = 2000
    $MAPX = 2000

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

    ;===== HAUPTSCHLEIFE =========

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

    FullsAni()
    _openmap()

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

    While 1
    $nMsg = GUIGetMsg()
    If $nMsg = -3 Then Exit
    If _IsPressed(57) Or _IsPressed(26) Then
    FullwAni()
    EndIf ; w
    If _IsPressed(41) Or _IsPressed(25) Then
    FullaAni()
    EndIf ; a
    If _IsPressed(53) Or _IsPressed(28) Then
    FullsAni()
    EndIf ; s
    If _IsPressed(44) Or _IsPressed(27) Then
    FulldAni()
    EndIf ; d
    If _IsPressed(10) Then
    $BEWEG_SPEED = 10
    Else
    $BEWEG_SPEED = 50
    EndIf
    WEnd

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

    ;====== BEWEGUNGS-RICHTUNGEN ========

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

    Func FullwAni()
    wAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    For $y = 0 To 128 Step 16
    $mY += 4
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,32,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 1
    EndFunc

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

    Func FullaAni()
    aAnimaD()
    If $BEWEG_RICHTUNG = 2 Then
    For $y = 0 To 128 Step 16
    $mX += 4
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,48,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 2
    EndFunc

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

    Func FullsAni()
    sAnimaD()
    If $BEWEG_RICHTUNG = 3 Then
    For $y = 0 To 128 Step 16
    $mY -= 4
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,0,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 3
    EndFunc

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

    Func FulldAni()
    dAnimaD()
    If $BEWEG_RICHTUNG = 4 Then
    For $y = 0 To 128 Step 16
    $mX -= 4
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,16,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 4
    EndFunc

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

    ;====== BEWEGUNGS-DREUNGEN ========

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

    Func dAnima()
    If $BEWEG_RICHTUNG < 4 Then
    For $i = 128 To 192 Step 16
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $i,0,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep(20)
    Next
    EndIf
    EndFunc

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

    Func wAnima()
    If $BEWEG_RICHTUNG > 1 Then
    For $i = 128 To 192 Step 16
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $i,16,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep(20)
    Next
    EndIf
    EndFunc

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

    Func aAnima()
    If $BEWEG_RICHTUNG = 1 Or $BEWEG_RICHTUNG = 3 Or $BEWEG_RICHTUNG = 4 Then
    For $i = 128 To 192 Step 16
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $i,32,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep(20)
    Next
    EndIf
    EndFunc

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

    Func sAnima()
    If $BEWEG_RICHTUNG = 1 Or $BEWEG_RICHTUNG = 2 Or $BEWEG_RICHTUNG = 4 Then
    For $i = 128 To 192 Step 16
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $i,48,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep(20)
    Next
    EndIf
    EndFunc

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

    Func wAnimaD()
    If $BEWEG_RICHTUNG = 2 Then
    sAnima()
    dAnima()
    wAnima()
    EndIf
    If $BEWEG_RICHTUNG = 3 Then
    dAnima()
    wAnima()
    EndIf
    If $BEWEG_RICHTUNG = 4 Then
    wAnima()
    EndIf
    EndFunc

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

    Func aAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    aAnima()
    EndIf
    If $BEWEG_RICHTUNG = 3 Then
    dAnima()
    wAnima()
    aAnima()
    EndIf
    If $BEWEG_RICHTUNG = 4 Then
    wAnima()
    aAnima()
    EndIf
    EndFunc

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

    Func sAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    aAnima()
    sAnima()
    EndIf
    If $BEWEG_RICHTUNG = 2 Then
    sAnima()
    EndIf
    If $BEWEG_RICHTUNG = 4 Then
    wAnima()
    aAnima()
    sAnima()
    EndIf
    EndFunc

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

    Func dAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    aAnima()
    sAnima()
    dAnima()
    EndIf
    If $BEWEG_RICHTUNG = 2 Then
    sAnima()
    dAnima()
    EndIf
    If $BEWEG_RICHTUNG = 3 Then
    dAnima()
    EndIf
    EndFunc

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

    Func openmap()
    _GDIPlus_GraphicsClear($hGr_Backbuffer, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($Map_Backbuffer, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $Map_backbuffer, 0, 0)
    EndFunc

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

    Func _openmap()
    Local $aArray[1]
    _FileReadToArray(@ScriptDir&"\maps\sclucht.map",$aArray)
    For $x = 1 To $aArray[0] Step 1
    $ss = StringSplit($aArray[$x]," ")
    $q = StringSplit($ss[2],";")
    If $ss[1] = "Gras" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,0,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Gravel" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,32,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Stein" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,64,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Wasser" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRL" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,160,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRR" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,192,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,224,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,256,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserELO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,32,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserELU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,64,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserERO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,128,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserERU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,96,32,32,$q[2],$q[2],32,32)
    EndIf
    Next
    EndFunc

    [/autoit]

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Hi,
    F4R, such mal zum Thema "Flackern" nach "Backbuffer" und wie und wozu dieser benutzt wird.

    Dann solltest du dir überlegen, wie du diese ellenlangen, immer wiederkehrenden Passagen in deinem Script sparen kannst.
    Bspw. deine Funktion _OpenMap(). Du könntest dir sämtliche IF-Abfragen bis auf eine sparen, wenn du die x- und y-Koordinate bspw direkt in den Namen integrieren würdest.
    Entweder du benutzt direkt ein 2-dimensionales Array (so ähnlich wie du es bereits mit Stringsplit() gelöst hast) , oder du schreibst sämtliche Beschreibungen in eine Zeile und dröselst diese per Stringsplit auseinander.

    Spoiler anzeigen
    [autoit]

    Func _openmap()
    Local $aArray[1]
    _FileReadToArray(@ScriptDir&"\maps\sclucht.map",$aArray)
    For $x = 1 To $aArray[0] Step 1
    $ss = StringSplit($aArray[$x]," ")
    $q = StringSplit($ss[2],";")
    If $ss[1] = "Gras" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,0,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Gravel" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,32,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Stein" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,64,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "Wasser" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,0,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRL" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,160,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRR" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,192,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,224,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserRO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,256,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserELO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,32,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserELU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,64,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserERO" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,128,32,32,$q[1],$q[2],32,32)
    EndIf
    If $ss[1] = "WasserERU" Then
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map,$SPS,96,96,32,32,$q[2],$q[2],32,32)
    EndIf
    Next
    EndFunc

    [/autoit]

    wird ersetzt durch

    Spoiler anzeigen
    [autoit]


    Func _openmap()
    Local $aArray[1]
    _FileReadToArray(@ScriptDir & "\maps\sclucht.map", $aArray)
    For $x = 1 To $aArray[0] Step 1
    $ss = StringSplit($aArray[$x], " ")
    $q = StringSplit($ss[2], ";")
    $x = $q[3] ;koordinaten
    $y = $q[4] ;koordinaten
    ; If $ss[1] = "Gras" Then ;fällt weg!!!
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Map, $SPS, $x, $y, 32, 32, $q[1], $q[2], 32, 32)
    ; EndIf
    Next
    EndFunc ;==>_openmap

    [/autoit]

    Weiterhin gibt es die Möglichkeit, einer Funktion Parameter mitzugeben.
    Du fragst bei WASD jede Taste in einer Funktion ab, das ist unnötig und bläht den Code auf!

    Spoiler anzeigen
    [autoit]

    Func FullwAni()
    wAnimaD()
    If $BEWEG_RICHTUNG = 1 Then
    For $y = 0 To 128 Step 16
    $mY += 4
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,32,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    EndIf
    $y = 0
    $BEWEG_RICHTUNG = 1
    EndFunc

    [/autoit]


    Ich würde eine "Universalfunktion" machen...(in Ermangelung der Maps nicht testbar, du solltest aber sehen woran du schrauben musst^^

    Spoiler anzeigen
    [autoit]

    Func FullAni($BEWEG_RICHTUNG) ;nur noch eine Funktion statt 4
    Anima($BEWEG_RICHTUNG) ;nur noch eine Funktion statt 4

    ; If $BEWEG_RICHTUNG = 1 Then ; fällt weg
    For $y = 0 To 128 Step 16
    $mY += 4 ;wird nie abgefragt???
    openMap()
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $schatten,265,280)
    ;schau dir mal an, was man mit der "richtigen" Zuweisung bei $BEWEG_RICHTUNG machen kann^^
    _GDIPlus_GraphicsDrawImageRectRect($hGr_Backbuffer, $char, $y,$BEWEG_RICHTUNG*16,15,15,250,250,50,50)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    Sleep($BEWEG_SPEED)
    Next
    ; EndIf
    $y = 0
    $BEWEG_RICHTUNG = 1 ;anpassen
    EndFunc

    [/autoit]

    Dein Problem wird nämlich werden, dass du Aufgrund der Menge an Code nicht mehr richtig durchblickst. Anderst du ggf. deine Geländeform, musst du hunderte Zeilen Code Hinzufügen oder Ändern. Da ist es wesentlich einfacher, eine Funktion zu schreiben, welche eine Erweiterung deiner Geländemapdatei einfach mit umsetzt.
    Der Programmcode sollte so geschrieben sein, dass Änderungen an externen Dateien automatisch umgesetzt werden.

  • Andy, echt großes Dankeschön an dich ! Du hast mir echt mega weitergeholfen da
    mich dieser riesen Codeberg ziemlich iritiert hat und die vereinfachungen die du gepostete hast
    sind super hilfreich :thumbup: , denn dieses Problem hatte ich auch mit meinem Map-Editor, den ich jetzt auch drastisch
    vereinfachen kann !

    Zum Thema Flackern und Buffern bin ich leider nicht weiter gekommen, aber falls jemand eine Lösung parat hat bitte posten

    PS: Sry das die Antwort so spät kommt

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Hi,
    stell mal bitte alle deine für das Script notwendigen Daten, also die aktuelle Scriptversion, Maps, Bitmaps usw. in den Startpost.
    Dann kann man testen und auch ggf. den einen oder anderen Verbesserungsvorschlag, bspw. auch das korrekte Backbuffering ;) , anbringen...

    Ich würde dir ausserdem empfehlen, dir die Scripte in der Signatur von unserem Forenmitglied UEZ anzuschauen, das meiste davon hat mit Grafiken zu tun, komprimierteres KnowHow wirst du in Verbindung mit AutoIt nur schwer finden :thumbup: