GDI+ globale Variable setzt sich zurück

  • Hi,

    habe ein, zumindestens für mich, seltsamens Problem. In folgendem Script lade ich zu beginn eine Bild in einer globale Variable:

    [autoit]

    Global $char = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chars\1.png")

    [/autoit]

    aus dieem Bild werden dann in einer Funktion mit "_GDIPlus_GraphicsDrawImageRectRect" einzelnen Bereiche ausgeschnitten und vergößert dargestellt. Soweit so gut. Jetzt habe ich allerdings drin, dass wenn eine Variable einen bestimmten Wert erreicht ein anderes Bild in die globale Variable geladen werden soll:

    [autoit]

    If $charselectkordy == 64 Then
    $charselectkordy = 192
    Else
    $charselectkordy = 64

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

    $chardateicount = $chardateicount + 1
    $char = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chars\" & $chardateicount & ".png")
    EndIf

    [/autoit]

    Und nun kommt das komische. Beim diekt drauffolgenden "_GDIPlus_GraphicsDrawImageRectRect" wird aus dem neuen Bild der Ausschnitt genommen. Beim nächsten aufrufen der Funktion allerdings wieder von dem alten obwohl das garnichtmehr in die Variable geladen wird.

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GuiOnEventMode", 1)

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

    OnAutoItExitRegister("_end")

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

    $Gui = GUICreate("Form1", 320, 240)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $charselectleft = GUICtrlCreateLabel("", 80, 180, 34, 25, 0x0000000D)
    GUICtrlSetOnEvent($charselectleft, "charselectleft")
    $charselectright = GUICtrlCreateLabel("", 195, 180, 34, 25, 0x0000000D)
    GUICtrlSetOnEvent($charselectright, "charselectright")
    GUISetState(@SW_SHOW)

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

    $chardateien = _FileListToArray(@ScriptDir & "\chars")

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

    _GDIPlus_Startup()

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

    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(320, 240, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)

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

    Global $char = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chars\1.png")
    $height = _GDIPlus_ImageGetHeight($char)
    $width = _GDIPlus_ImageGetWidth($char)

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

    $bk = _GDIPlus_ImageLoadFromFile("charselect.png")

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

    $changeright = _GDIPlus_ImageLoadFromFile("auswahlrechts.png")

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

    $changeleft = _GDIPlus_ImageLoadFromFile("auswahllinks.png")

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

    Global $charselectkordx = 0
    Global $charselectkordy = 0
    Global $chardateicount = 1
    _charchange($buffer, $bk, $char, $graphic, $bitmap)

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

    While 1

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

    WEnd

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

    Func charselectleft()
    _charchange($buffer, $bk, $char, $graphic, $bitmap, "left")
    EndFunc ;==>charselectleft

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

    Func charselectright()
    _charchange($buffer, $bk, $char, $graphic, $bitmap, "right")
    EndFunc ;==>charselectright

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

    Func CLOSEClicked()
    Exit
    EndFunc ;==>CLOSEClicked

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

    Func _charchange($buffer, $bk, $char, $graphic, $bitmap, $direction = "start")
    Switch $direction
    Case "start"
    $charselectkordx = 24
    $charselectkordy = 64
    Case "left"
    $charselectkordx = $charselectkordx - 72
    If $charselectkordx < 24 Then
    If $charselectkordy == 64 Then
    $charselectkordy = 192
    Else
    $charselectkordy = 64
    EndIf

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

    $charselectkordx = 240
    EndIf
    Case "right"
    $charselectkordx = $charselectkordx + 72
    If $charselectkordx > 240 Then
    If $charselectkordy == 64 Then
    $charselectkordy = 192
    Else
    $charselectkordy = 64

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

    $chardateicount = $chardateicount + 1
    $char = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chars\" & $chardateicount & ".png")
    EndIf

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

    $charselectkordx = 24
    EndIf
    EndSwitch

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

    _GDIPlus_GraphicsDrawImageRect($buffer, $bk, 0, 0, 320, 240)
    _GDIPlus_GraphicsDrawImageRect($buffer, $changeleft, 80, 180, 34, 25)
    _GDIPlus_GraphicsDrawImageRect($buffer, $changeright, 195, 180, 34, 25)
    _GDIPlus_GraphicsDrawImageRectRect($buffer, $char, $charselectkordx, $charselectkordy, 24, 32, 120, 110, 24 * 3, 32 * 3)
    _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0)
    _GDIPlus_GraphicsClear($buffer, 0xFF000000)
    EndFunc ;==>_charchange

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

    Func _end()
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_ImageDispose($char)
    _GDIPlus_ImageDispose($bk)
    _GDIPlus_Shutdown()
    EndFunc ;==>_end

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    2 Mal editiert, zuletzt von chip (27. September 2011 um 14:43)

  • Deine Funktion

    [autoit]

    Func _charchange($buffer, $bk, $char, $graphic, $bitmap, $direction = "start")

    [/autoit]


    heißt du übergibst der Funktion eine Variable $char.

    Laut Hilfe:
    "Wenn Variablen verwendet werden, wird zuerst geprüft, ob die Variable lokal existiert, und erst danach, ob sie global deklariert ist."

    Das heißt in der Funktion nutzt er das Loakle $char, ausserhalb das Globale.
    du änderst nur das Lokale, in der Funktion, gültige char.

    Warum übergibst du $char überhaupt an die Funktion? ist doch global ;)

  • Ach misst da hab ich doch glatt vergessen gehabt die raus zu machen. *lach* aber lieber so ein Fehler als was ernstes. Danke :).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.