2 GDI+ Bilder in verschiedenen Geschwindigkeiten bewegen

  • Hallo Leute,

    ich habe ein Problem. Und zwar möchte ich ein Spiel programmieren,
    indem sich mehrere Objekte unabhängig voneinander bewegen. Sie sollen
    in unterschiedlichen Geschwindigkeiten bewegt werden.

    Wie kann ich das am besten anstellen?

    Habe da schonmal was vorbereitet, allerdings noch ohne GDI+, weil das bei
    mir irgendwie nicht hingehauen hat.

    Bisheriges Skript
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <misc.au3>

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

    $Height = 50
    $Width = 50
    $IchPosition = 2

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

    $Form1 = GUICreate("Form1", 410, 126, 192, 124)
    $Ich = GUICtrlCreateLabel("", 24, 60, $Width, $Height)
    GUICtrlSetBkColor(-1, 0x000000)
    $Gegner = GUICtrlCreateLabel("", 192, 8, $Width, $Height)
    GUICtrlSetBkColor(-1, 0x800000)
    GUISetState(@SW_SHOW)
    AdlibRegister("_ChangePosition", 40)

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

    _GegnerLinks(2)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _GegnerLinks($Position)
    ;~ Func _GegnerLinks()
    ;~ $Position = 1
    Switch $Position
    Case 1
    $Position = 10
    Case 2
    $Position = 60
    EndSwitch
    For $i = 410 To -$Width Step -10
    GUICtrlSetPos($Gegner, $i, $Position)
    $IchPos = ControlGetPos("","", $Ich)

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

    $Sleep = TimerInit()
    While TimerDiff($Sleep) < 100
    WEnd
    Next
    EndFunc

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

    Func _ChangePosition()
    If _IsPressed(01) Then
    If $IchPosition = 1 Then
    $IchPosition = 2
    GUICtrlSetPos($Ich, 24, 60)
    Else
    $IchPosition = 1
    GUICtrlSetPos($Ich, 24, 10)
    EndIf
    While _IsPressed(01)
    WEnd
    EndIf
    EndFunc

    [/autoit]

    Ziel ist es, dass man den Blöcken ausweicht. ;)

    Danke für Antworten im voraus!

    MfG
    qixx

  • Hi,
    du kannst die X od. Y Variablen jedesmal um einen bestimmten Betrag heben oder senken und dann wie gewohnt rendern. Dadurch kommt der Effekt schon zustande.
    Hier mal ein Beispiel

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    HotKeySet("{Esc}", "_Exit")
    $sText = "Hallo"

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

    $hGUI = GUICreate("Test", 500, 500)
    $hGUI_DC = _WinAPI_GetDC($hGUI)

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

    $hBitmap = _WinAPI_CreateCompatibleBitmap($hGUI_DC, 500, 500)
    $hGraphics_DC = _WinAPI_CreateCompatibleDC($hGUI_DC)
    _WinAPI_SelectObject($hGraphics_DC, $hBitmap)

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hGraphics_DC)
    $hBrush_White = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

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

    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)

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

    Global $X1 = 0, $Y1 = 0, $X2 = 0, $Y2 = 100

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

    GUISetState(@SW_SHOW)
    While Sleep(10)
    _GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 500, 500, $hBrush_White)

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

    ;Hier wird der Effekt erzeugt
    $X1 += 1
    $X2 += 3

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

    _GDIPlus_GraphicsFillRect($hGraphics, $X1, $Y1, 50, 50)
    _GDIPlus_GraphicsFillRect($hGraphics, $X2, $Y2, 50, 50)

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

    If $X1 > 450 Then $X1 = 0
    If $X2 > 450 Then $X2 = 0
    ;EffectEnd :D
    _WinAPI_BitBlt($hGUI_DC, 0, 0, 500, 500, $hGraphics_DC, 0, 0, $SRCCOPY)
    WEnd

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

    Func _Exit()
    _WinAPI_DeleteDC($hGraphics_DC)
    _WinAPI_ReleaseDC($hGUI, $hGUI_DC)
    _WinAPI_DeleteObject($hBitmap)
    _GDIPlus_BrushDispose($hBrush_White)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Irgendwie bekomme ich das nicht gebacken. xD
    Ich weiß auch gar nicht, was ich bei

    [autoit]

    _GDIPlus_GraphicsDrawImageRect

    [/autoit]


    in die ersten beiden Parameter eintragen soll..
    Einmal Grafik und einmal Bild? oO
    Und die Beispiele in der Hilfe helfen mir leider auch
    nicht weiter...

    Könnte mir vielleicht jemand ein ganz kleinen Codeschnipsel
    zeigen, in der ein Bild aufgerufen wird und in eine GUI angezeigt
    wird? Wäre echt super, sonst checke ich das anscheindend
    nicht. :D

    Danke!

    MfG
    qixx

  • Am besten ließt du dir ein GDI+ Tutorial durch (Forensuche) und schaust dir auch ein paar Beispiele von UEZ, eukalyptus, H112, clezZ und diesen ganzen anderen GDI+ Freaks an :whistling: .
    Du musst bei _GDIPlus_GraphicsDrawImageRect ein Handle zur Grafik und ein Handle zum, mit _GDIPlus_ImageLoadFromFile geladenen, Bild angeben.