GDI Plus - Bilder verschieben

  • Hi
    Ihc möchte einfach nur zum test eine kleine menschenmenge über den bildschirm flitzen lassen
    deswegen habe ich schnell ein skript erstellt
    doch irgendwie erscheinen keine bilder, es sollte eigentlich alles richtig laufen (von der logik)

    kann mir jemand weiterhelfen?

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiConstants.au3>
    #include <GdiPlus.au3>
    #include <Misc.au3>

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

    Local $max_x = 300, $max_y = 300

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

    $Gui = GUICreate("Beispiel", $max_x, $max_y)

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

    Dim $weg = _erstelle_weg($max_x, $max_y)
    Dim $temp[2]

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

    $move_figures = TimerInit()
    $new_figure = TimerInit()

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

    GUISetBkColor(0xFFFFFF, $Gui)
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    ; array mit allen figuren
    Dim $figuren[1] = [0]

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

    $height = _GDIPlus_ImageGetHeight($temp[0])
    $width = _GDIPlus_ImageGetWidth($temp[0])
    $verhaelnis = $height / $width
    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)

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

    While True
    ; nach zufälligen abstand von 1 - 100 ms ein neues mänchen zeichen
    If TimerDiff($new_figure) > Random(1, 100, 1) Then
    ; im index 0 das bildhandle, im index 1 die position auf dem weg-array
    Local $temp[2] = [_GDIPlus_ImageLoadFromFile(@ScriptDir & "\figur.gif"), 0]

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

    ; neue figur
    $figuren[0] += 1

    ; array ins n feld einfügen
    _ArrayAdd($figuren, $temp)

    ; neuen stempel für die zufallswartezeit erstellen
    $new_figure = TimerInit()
    EndIf

    ; nach 10 ms verstrichener zeit, figuren erneut bewegen
    If TimerDiff($move_figures) > 10 Then
    ; für alle figuren
    For $i = 1 To $figuren[0]
    ; kopiere das array aus dem großen array zurück
    Local $temp = $figuren[$i]
    ; lass männchen 1 position am weg wandern
    $temp[1] += 1

    ; X- und Y-Koordinate aus dem weg der position des männchen lesen
    Local $current_pos = $weg[$temp[1] + 1]

    ; geändertes kleines array (pos am weg) wieder zurück ins große array speichern
    $figuren[$i] = $temp

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

    ; bild verschieben
    _GDIPlus_GraphicsDrawImageRect($graphic, $temp[0], $current_pos[0], $current_pos[1], 20, 20 * $verhaelnis)
    Next


    $move_figures = TimerInit()
    EndIf

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _erstelle_weg($max_x, $max_y)
    Dim $weg[1] = [0]
    Dim $pos[2] = [0, 0]

    Local $x = 0, $y = 0

    While($x < $max_x And $y < $max_y)
    If Random(0, 1, 1) == 0 Then
    $x += 1
    Else
    $y += 1
    EndIf

    $pos[0] = $x
    $pos[1] = $y

    $weg[0] += 1
    _ArrayAdd($weg, $pos)
    ;~ GUICtrlCreatePic("line.bmp", $x, $y, 1, 1, $BS_BITMAP)
    WEnd

    Return $weg
    EndFunc

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

    das array $figuren enthält weitere arrays, im feld [0] steht wie viele
    in den kleinen arrays ist index 0 das handle zum erstellten gdi bild
    im index 1 die nummer, an welcher position des weges das aktuelle mänchen sich gerade befindet

  • [autoit]

    _GDIPlus_GraphicsDrawImageRect($graphic, $temp[0], $current_pos[0], $current_pos[1], 20, 20 * $verhaelnis)

    [/autoit]


    Guck dir die function in der Hilfe an, du bestimmst ja selber wo X & Y ist ...

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • [autoit]

    $verhaelnis

    [/autoit]

    ist immer 0, da $temp[0] zum Zeitpunkt der Berechnung noch garkein Handle eines Bildes enthält. Zufälligerweise berechnet aber

    [autoit]

    _GDIPlus_ImageGetWidth(0)

    [/autoit]

    irgendeine Zahl, es wird auch kein @error gesetzt, ansonsten würde durch 0 geteilt und ein Fehler generiert! Da $verhaelnis=0 ist die Höhe des Bildes bei

    [autoit]

    _GDIPlus_GraphicsDrawImageRect($graphic, $temp[0], $current_pos[0], $current_pos[1], 20, 20 * $verhaetlnis)

    [/autoit]

    natürlich auch 0 und somit wird es nicht dargestellt....
    Debugging FTW!

    Spoiler anzeigen
    [autoit]

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

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

    Local $max_x = 300, $max_y = 300

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

    $Gui = GUICreate("Beispiel", $max_x, $max_y)

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

    Dim $weg = _erstelle_weg($max_x, $max_y)

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

    Dim $temp[2]

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

    $move_figures = TimerInit()
    $new_figure = TimerInit()

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

    GUISetBkColor(0xFFFFFF, $Gui)
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()
    $temp[0]=_GDIPlus_ImageLoadFromFile(@ScriptDir & "\figur.bmp")

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

    ; array mit allen figuren
    Dim $figuren[1] = [0]

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

    $height = _GDIPlus_ImageGetHeight($temp[0])
    $width = _GDIPlus_ImageGetWidth($temp[0])
    $verhaetlnis = $height / $width
    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)

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

    While True
    ; nach zufälligen abstand von 1 - 100 ms ein neues mänchen zeichen
    If TimerDiff($new_figure) > Random(1, 100, 1) Then
    ; im index 0 das bildhandle, im index 1 die position auf dem weg-array
    Local $temp[2] = [_GDIPlus_ImageLoadFromFile(@ScriptDir & "\figur.bmp"), 0]

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

    ; neue figur
    $figuren[0] += 1

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

    ; array ins n feld einfügen
    _ArrayAdd($figuren, $temp)

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

    ; neuen stempel für die zufallswartezeit erstellen
    $new_figure = TimerInit()
    EndIf

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

    ; nach 10 ms verstrichener zeit, figuren erneut bewegen
    If TimerDiff($move_figures) > 10 Then
    ; für alle figuren
    For $i = 1 To $figuren[0]
    ; kopiere das array aus dem großen array zurück
    Local $temp = $figuren[$i]
    ; lass männchen 1 position am weg wandern
    $temp[1] += 1

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

    ; X- und Y-Koordinate aus dem weg der position des männchen lesen
    Local $current_pos = $weg[$temp[1] + 1]
    ;
    ; geändertes kleines array (pos am weg) wieder zurück ins große array speichern
    $figuren[$i] = $temp

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

    ; bild verschieben
    _GDIPlus_GraphicsDrawImageRect($graphic, $temp[0], $current_pos[0], $current_pos[1], 20, 20 * $verhaetlnis)
    sleep(50)
    Next

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

    $move_figures = TimerInit()
    EndIf

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _erstelle_weg($max_x, $max_y)
    Dim $weg[1] = [0]
    Dim $pos[2] = [0, 0]

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

    Local $x = 0, $y = 0

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

    While($x < $max_x And $y < $max_y)
    If Random(0, 1, 1) == 0 Then
    $x += 1
    Else
    $y += 1
    EndIf

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

    $pos[0] = $x
    $pos[1] = $y

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

    $weg[0] += 1
    _ArrayAdd($weg, $pos)
    ;~ GUICtrlCreatePic("line.bmp", $x, $y, 1, 1, $BS_BITMAP)
    WEnd

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

    Return $weg
    EndFunc

    [/autoit]

    jedenfalls wird jetzt das Männlein angezeigt, der Weg ist aber seltsam^^

  • Wieso machst du das eigentlich mit GDI+? Waum nicht mit GUICtrlCreatePic?

    Andy: Das heißt übrigens $verhaeltnis ;)

  • Zitat

    Andy: Das heißt übrigens $verhaeltnis

    ach...ICH weiss das^^, aber Rechtschreibfehler in anderer Leute Variablennamen zu verbessern...soweit käme es noch!
    /EDIT/ rofl, habs gesehen, ich hatte es tatsächlich verschlimmbessert :thumbup: