GDIPlus Problem

  • Hallo,

    Ich wollte mich gerne mit GDIPlus beschäftigen doch jetzt komme ich nicht so wirklich weiter, eine Grafik bekomme ich angezeigt den Player
    doch jetzt will ich gerne auch einen baum anzeigen lassen doch wenn ich mich mit den Player bewege verschiendet der Baum ?

    hier das Script

    [autoit]


    #RequireAdmin
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 623, 446, @DesktopWidth / 2, 124) ; Später wieder einbauen ! $WS_POPUPWINDOW
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $aCharakter[4] = ['player_img\up_player.png', 'player_img\down_player.png', 'player_img\left_player.png', 'player_img\right_player.png'] ; [0]UP - [1]DOWN -[2]LEFT -[3]RIGHT
    Global $aObjekte [2] = ['objekte_img\Background.png', 'objekte_img\Baum.png'] ; [0]BK -[1]BAUM

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

    Global $FigurUp, $FigurDown, $FigurLeft, $FigurRight
    Global $FigurUpHeight, $FigurDownHeight, $FigurLeftHeight, $FigurRightHeight
    Global $FigurUpWidth, $FigurDownWidth, $FigurLeftWidth, $FigurRightWidth
    Global $FigurUpVer, $FigurDownVer, $FigurLeftVer, $FigurRightVer
    Global $PlayerPos_X = 20, $PlayerPos_Y = 20
    Global $Background, $BackgroundHeight, $BackgroundWidth, $BackgroundVer
    Global $Baum, $BaumHeight, $BaumWidth, $BaumVer
    Global $hGrafik, $hBitmap, $hBuffer

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

    _GDIPlus_Startup()
    ;////////////// Laden Objekte ///////////////////////////
    $FigurUp = _GDIPlus_ImageLoadFromFile($aCharakter[0])
    $FigurDown = _GDIPlus_ImageLoadFromFile($aCharakter[1])
    $FigurLeft = _GDIPlus_ImageLoadFromFile($aCharakter[2])
    $FigurRight = _GDIPlus_ImageLoadFromFile($aCharakter[3])
    $Background = _GDIPlus_ImageLoadFromFile($aObjekte[0])
    $Baum = _GDIPlus_ImageLoadFromFile($aObjekte[1])
    ;///////////// Height der Objekte ///////////////////////
    $FigurUpHeight = _GDIPlus_ImageGetHeight($FigurUp)
    $FigurDownHeight = _GDIPlus_ImageGetHeight($FigurDown)
    $FigurLeftHeight = _GDIPlus_ImageGetHeight($FigurLeft)
    $FigurRightHeight = _GDIPlus_ImageGetHeight($FigurRight)
    $BackgroundHeight = _GDIPlus_ImageGetHeight($Background)
    $BaumHeight = _GDIPlus_ImageGetHeight($Baum)
    ;////////////// Width der Objekte ////////////////////////
    $FigurUpWidth = _GDIPlus_ImageGetWidth($FigurUp)
    $FigurDownWidth = _GDIPlus_ImageGetWidth($FigurDown)
    $FigurLeftWidth = _GDIPlus_ImageGetWidth($FigurLeft)
    $FigurRightWidth = _GDIPlus_ImageGetWidth($FigurRight)
    $BackgroundWidth = _GDIPlus_ImageGetWidth($Background)
    $BaumWidth = _GDIPlus_ImageGetWidth($Baum)
    ;///////////// Verhältnise der Objekte ///////////////////
    $FigurUpVer = $FigurUpHeight / $FigurUpWidth
    $FigurDownVer = $FigurDownHeight / $FigurDownWidth
    $FigurLeftVer = $FigurLeftHeight / $FigurLeftWidth
    $FigurRightVer = $FigurRightHeight / $FigurRightWidth
    $BackgroundVer = $BackgroundHeight / $BackgroundWidth
    $BaumVer = $BaumHeight / $BaumWidth

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

    ;//////////// Der Buffer ///////////////////////////////////
    $hGrafik = _GDIPlus_GraphicsCreateFromHWND($Form1)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(623, 446, $hGrafik)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _Exit()
    Case _Steuerung()

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

    EndSwitch
    WEnd

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

    Func _Exit()
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func _Objekte_Draw($Obj, $Width, $Verhealtnis)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $Background, 0, 0, 623, 446)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $Obj, $PlayerPos_X, $PlayerPos_Y, $Width, 20 * $Verhealtnis)
    _GDIPlus_GraphicsDrawImage($hGrafik, $hBitmap, 0, 0)
    EndFunc

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

    Func _Steuerung()
    Select
    Case _IsPressed(25) And Not $PlayerPos_X <= 0 ; LEFT
    $PlayerPos_X -= 10
    _Objekte_Draw($FigurLeft, 20, $FigurLeftVer)
    Case _IsPressed(26) And Not $PlayerPos_Y <= 0 ; UP
    $PlayerPos_Y -= 10
    _Objekte_Draw($FigurUp, 20, $FigurUpVer)
    Case _IsPressed(27) And Not $PlayerPos_X <= 610 ; RIGHT
    $PlayerPos_X += 10
    _Objekte_Draw($FigurRight, 20, $FigurRightVer)
    Case _IsPressed(28) And Not $PlayerPos_Y <= 440 ; DOWN
    $PlayerPos_Y += 10
    _Objekte_Draw($FigurDown, 20, $FigurDownVer)
    EndSelect
    EndFunc

    [/autoit]

    Vlt kann mir jemand helfen ?

  • Ja, du musst nur in der Funktion _Objekte_Draw den Baum neu zeichnen.
    (Hab mir jetzt nicht groß das Script angesehen :P Müsste aber daran liegen das du den Baum nicht neu zeichnest...)

  • In deinem Script wird soweit ich sehen kann nirgendwo ein Baum gezeichnet... Natürlich kann ich auch nicht testen wo dein Problem liegt, da mir die Bilder fehlen.
    Aufgefallen ist mir an deinem Script:
    - Du verwendest gerne Englische und Deutsche Begriffe in einer seltsamen Mixtur. Das macht es für andere schwer den Code zu verstehen. Halte dich am besten an Englische Begriffe, wie der Rest der Programmiersprache auch ;).
    - Du entfernst nie die erzeugten GDI+ Objekte aus dem Arbeitsspeicher. Die Funktionen gibt es nicht umsonst, und in den Hilfebeispielen werden sie auch nicht zum Spaß verwendet. Ich hab sie mal bei dir eingefügt.

    Das ist natürlich längst nicht alles was man an deinem Script verbessern könnte, aber so sollte es erstmal funktionieren...

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>
    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 623, 446, @DesktopWidth / 2, 124) ; Später wieder einbauen ! $WS_POPUPWINDOW
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    Global $aCharakter[4] = ['player_img\up_player.png', 'player_img\down_player.png', 'player_img\left_player.png', 'player_img\right_player.png'] ; [0]UP - [1]DOWN -[2]LEFT -[3]RIGHT
    Global $aObjekte[2] = ['objekte_img\Background.png', 'objekte_img\Baum.png'] ; [0]BK -[1]BAUM

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

    Global $FigurUp, $FigurDown, $FigurLeft, $FigurRight
    Global $FigurUpHeight, $FigurDownHeight, $FigurLeftHeight, $FigurRightHeight
    Global $FigurUpWidth, $FigurDownWidth, $FigurLeftWidth, $FigurRightWidth
    Global $FigurUpVer, $FigurDownVer, $FigurLeftVer, $FigurRightVer
    Global $PlayerPos_X = 20, $PlayerPos_Y = 20
    Global $Background, $BackgroundHeight, $BackgroundWidth, $BackgroundVer
    Global $Baum, $BaumHeight, $BaumWidth, $BaumVer
    Global $hGrafik, $hBitmap, $hBuffer

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

    _GDIPlus_Startup()
    ;////////////// Laden Objekte ///////////////////////////
    $FigurUp = _GDIPlus_ImageLoadFromFile($aCharakter[0])
    $FigurDown = _GDIPlus_ImageLoadFromFile($aCharakter[1])
    $FigurLeft = _GDIPlus_ImageLoadFromFile($aCharakter[2])
    $FigurRight = _GDIPlus_ImageLoadFromFile($aCharakter[3])
    $Background = _GDIPlus_ImageLoadFromFile($aObjekte[0])
    $Baum = _GDIPlus_ImageLoadFromFile($aObjekte[1])
    ;///////////// Height der Objekte ///////////////////////
    $FigurUpHeight = _GDIPlus_ImageGetHeight($FigurUp)
    $FigurDownHeight = _GDIPlus_ImageGetHeight($FigurDown)
    $FigurLeftHeight = _GDIPlus_ImageGetHeight($FigurLeft)
    $FigurRightHeight = _GDIPlus_ImageGetHeight($FigurRight)
    $BackgroundHeight = _GDIPlus_ImageGetHeight($Background)
    $BaumHeight = _GDIPlus_ImageGetHeight($Baum)
    ;////////////// Width der Objekte ////////////////////////
    $FigurUpWidth = _GDIPlus_ImageGetWidth($FigurUp)
    $FigurDownWidth = _GDIPlus_ImageGetWidth($FigurDown)
    $FigurLeftWidth = _GDIPlus_ImageGetWidth($FigurLeft)
    $FigurRightWidth = _GDIPlus_ImageGetWidth($FigurRight)
    $BackgroundWidth = _GDIPlus_ImageGetWidth($Background)
    $BaumWidth = _GDIPlus_ImageGetWidth($Baum)
    ;///////////// Verhältnise der Objekte ///////////////////
    $FigurUpVer = $FigurUpHeight / $FigurUpWidth
    $FigurDownVer = $FigurDownHeight / $FigurDownWidth
    $FigurLeftVer = $FigurLeftHeight / $FigurLeftWidth
    $FigurRightVer = $FigurRightHeight / $FigurRightWidth
    $BackgroundVer = $BackgroundHeight / $BackgroundWidth
    $BaumVer = $BaumHeight / $BaumWidth

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

    ;//////////// Der Buffer ///////////////////////////////////
    $hGrafik = _GDIPlus_GraphicsCreateFromHWND($Form1)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(623, 446, $hGrafik)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _Exit()
    EndSwitch
    _Steuerung()
    WEnd

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGrafik)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($FigurDown)
    _GDIPlus_ImageDispose($FigurLeft)
    _GDIPlus_ImageDispose($FigurRight)
    _GDIPlus_ImageDispose($FigurUp)
    _GDIPlus_ImageDispose($Background)
    _GDIPlus_ImageDispose($Baum)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

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

    Func _Objekte_Draw($Obj, $Width, $Verhealtnis)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $Background, 0, 0, 632, 446)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $Baum, 20, 20, $BaumWidth, $BaumHeight)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $Obj, $PlayerPos_X, $PlayerPos_Y, $Width, 20 * $Verhealtnis)
    _GDIPlus_GraphicsDrawImageRect($hGrafik, $hBitmap, 0, 0, 632, 446)
    EndFunc ;==>_Objekte_Draw

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

    Func _Steuerung()
    Select
    Case _IsPressed(25) And Not $PlayerPos_X <= 0 ; LEFT
    $PlayerPos_X -= 10
    _Objekte_Draw($FigurLeft, 20, $FigurLeftVer)
    Case _IsPressed(26) And Not $PlayerPos_Y <= 0 ; UP
    $PlayerPos_Y -= 10
    _Objekte_Draw($FigurUp, 20, $FigurUpVer)
    Case _IsPressed(27) And Not $PlayerPos_X <= 610 ; RIGHT
    $PlayerPos_X += 10
    _Objekte_Draw($FigurRight, 20, $FigurRightVer)
    Case _IsPressed(28) And Not $PlayerPos_Y <= 440 ; DOWN
    $PlayerPos_Y += 10
    _Objekte_Draw($FigurDown, 20, $FigurDownVer)
    EndSelect
    EndFunc ;==>_Steuerung

    [/autoit]
  • Sobald sich etwas an deiner Grafik verändern soll, musst du alles komplett neu zeichnen, was danach noch zu sehen sein soll. Zuerst das Objekt das am zuunterst liegen soll (Hintergrund) und dann Schritt für Schritt nach vorne.
    Wenn du den Baum nicht neu zeichnest, dann wird er vom Hintergrund oder einer der anderen Bilder einfach übermalt. So funktioniert nun mal GDI+.