GDI+ Sinuskurve

  • So langsam komm ich mir schon blöd vor :S

    Ich habe mal diesen einfachen Blitz3D Code geschrieben:

    Code
    Graphics 640,480,16,3
    For I = 0 To 720
    	Color 255,0,255
    	Plot I,240+(Sin(I)*100)
    Next
    WaitKey


    Dabei kommt folgendes raus:
    autoit.de/wcf/attachment/8149/
    Wenn ich das aber in AutoIt Code übersetze,

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    $hGUI = GUICreate("Sinuskurve", 640, 480)
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    GUISetState()
    Do
    Until GUIGetMsg() = -3

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

    Func WM_PAINT()
    For $i = 0 To 720
    _GDIPlus_GraphicsFillRect($hGraphic,$i,240 + (Sin($i) * 100),1,1)
    Next
    EndFunc ;==>WM_PAINT

    [/autoit]


    Erhalte ich das hier:
    autoit.de/wcf/attachment/8150/

    Da stellt sich mir eine Frage:

    WARUM!?


    Ich glaub echt langsam, dass ich blöd geworden bin nach einem Jahr ohne Schule. Ich glaub der ganze Mathekram ist weg :D

    ... Leider nicht unbedingt vorteilhaft für GDI+ :D

  • Keine Angst, liegt nicht an dir!

    AutoIt rechnet mit Radiant statt mit Grad:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    $hGUI = GUICreate("Sinuskurve", 640, 480)
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    GUISetState()
    Do
    Until GUIGetMsg() = -3

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

    Func WM_PAINT()
    Local $pi = 3.14159265358979
    Local $degToRad = $pi / 180
    For $i = 0 To 720
    _GDIPlus_GraphicsFillRect($hGraphic,$i,240 + (Sin($i*$degToRad) * 100),1,1)
    Next
    EndFunc ;==>WM_PAINT

    [/autoit]
  • _GDIPlus_GraphicsDrawCurve gibts auch noch. Damit kannst du das Array entsprechend der Sinusfunktion füllen.
    Bsp:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

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

    Opt('MustDeclareVars', 1)

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

    _Main()

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

    Func _Main()
    Local $hGUI, $hGraphic, $aPoints[5][2]

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

    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    GUISetState()
    Local $pi = 3.14159265358979
    ; Draw a cardinal spline
    _GDIPlus_Startup ()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)

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

    $aPoints[0][0] = 4
    $aPoints[1][0] = 0
    $aPoints[1][1] = 200
    $aPoints[2][0] = $pi/2*50
    $aPoints[2][1] = 150
    $aPoints[3][0] = 1.5*$pi*50
    $aPoints[3][1] = 250
    $aPoints[4][0] = 2.5*$pi*50
    $aPoints[4][1] = 150

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

    _GDIPlus_GraphicsDrawCurve ($hGraphic, $aPoints)

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

    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    ; Clean up resources
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_Shutdown ()

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

    EndFunc ;==>_Main

    [/autoit]
  • Hat mir sehr geholfen danke!

    Nun noch eine Frage:
    Folgendes Script flackert trotz BackBuffer sehr stark

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")
    _GDIPlus_Startup()

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

    Global $iSpeed = 5

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

    Global $iDegToRad = 3.14159265358979 / 180
    Global $iWidth = 800, $iHeight = 200
    $GUI_Back_Color = 0xF0F0F0

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

    Dim $aLine[43][2] = [[42, ""],[0 - 10, $iHeight + 10]] ; Array mit koordinaten für _GDIPlus_Graphicsdrawcurve
    For $i = 2 To UBound($aLine) - 2
    $aLine[$i][0] = ($i - 1) * 20
    $aLine[$i][1] = $iHeight / 1.5 + Sin(($i - 1) * Random(10, 30, 1) * $iDegToRad) * 100
    Next
    $aLine[42][0] = $iWidth - 10
    $aLine[42][1] = $iHeight + 10

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

    ;~ _ArrayDisplay($aLine)

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

    $hGUI = GUICreate("", $iWidth, $iHeight)
    GUISetOnEvent(-3, "OnEvent_Eventhandler")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $GUI_Back_Color)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    GUISetState()
    While 1 * Sleep(10)
    Local $iUbound = UBound($aLine)
    For $i = 2 To $iUbound - 3 ; Alle außer die Eckpunkten ul & ur
    $aLine[$i][0] = $aLine[$i][0] - $iSpeed ; geschwindigkeit von X-Koordinate abziehen (Bewegung links)
    Next

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

    If $aLine[2][0] <= 0 Then ; Wenn erster richtiger punkt X <= 0 hat, dann
    For $i = 2 To $iUbound - 3
    $aLine[$i][1] = $aLine[$i + 1][1] ; Alle punkte im Array eins nach oben schieben,
    $aLine[$i][0] = $aLine[$i + 1][0]
    Next
    $aLine[$iUbound - 2][1] = $iHeight / 1.5 + Sin(($iUbound - 2) * Random(10, 30, 1) * $iDegToRad) * 100 ; Und neue Koordinate einfügen (Sonst ist die bewegung vorbei, wenn 1x alle punkte durch sind)
    EndIf
    ;~ _ArrayDisplay($aLine)
    WM_PAINT()
    WEnd

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

    Func OnEvent_Eventhandler()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc ;==>OnEvent_Eventhandler

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

    Func WM_PAINT()
    _GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000 + $GUI_Back_Color)
    ;~ _GDIPlus_GraphicsDrawClosedCurve($hBackbuffer, $aLine)
    _GDIPlus_GraphicsFillClosedCurve($hBackbuffer, $aLine)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

    [/autoit]

    Eigentlich funktioniert alles wie es soll, aber es flackert halt sehr stark :S
    Wo liegt mein Fehler? Und welche anderen Möglichkeiten gäbe es, sowas zu zeichnen?

    hat jemand zufällig ein Beispielscript in dem eine Landschaft generiert wird?
    Würde mich mal interessieren wie sowas vom Code her aussieht

  • _GDIPlus_GraphicsSetSmoothingMode() würde schonmal gegen die Zacken helfen. Das Flackern ist echt komisch. ?(
    Stellt man den Speed runter wirds besser, womöglich ist das einfach zu fies für unsere Systeme?

    edit \ Oder die Kurvenfunktion eignet sich dafür nicht (zu langsam?), versuchs doch mal mit der Varainte von eukalyptus.

    2 Mal editiert, zuletzt von nuts (11. März 2010 um 13:43)

  • Das ist meiner Meinung nach die fast optimale Lösung, noch ohne Scrollen, das optimiere ich gerade noch ;)

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    $hGUI = GUICreate("Sinuskurve", 640, 480)
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBackBuffer = _GDIPlus_BitmapCreateFromGraphics(640, 480, $hGraphic)
    $hBackGraphic = _GDIPlus_ImageGetGraphicsContext($hBackBuffer)
    OnAutoItExitRegister("_Clear")

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

    ; berechnen
    Local $pi = 3.14159265358979
    Local $degToRad = $pi / 180
    Local $aPoints[641][2] =[[640]]
    For $i = 0 To 639
    $aPoints[$i+1][0] = $i
    $aPoints[$i+1][1] = 240 + (Sin($i*$degToRad) * 100)
    Next

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

    ; Zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackGraphic, 2)
    _GDIPlus_GraphicsClear($hBackGraphic, 0xFFF8F8F8)
    _GDIPlus_GraphicsDrawCurve($hBackGraphic, $aPoints)

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

    GUISetState()
    Do
    Until GUIGetMsg() = -3

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

    Func _Clear()
    ; Ressourcen freigeben
    _GDIPlus_GraphicsDispose($hBackGraphic)
    _GDIPlus_BitmapDispose($hBackBuffer)
    _GDIPlus_GraphicsDispose($hGraphic)
    EndFunc

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

    Func WM_PAINT()
    ; auf GUI zeichnen
    _GDIPlus_GraphicsDrawImage($hGraphic, $hBackBuffer, 0, 0)
    EndFunc ;==>WM_PAINT

    [/autoit]
  • Mit der normalen

    [autoit]

    _GDIPlus_GraphicsDrawClosedCurve

    [/autoit]

    Funktion klappt es ja (fast?!)
    nur sobald ich versuche das ganze zu füllen flackert es stark.
    _GDIPlus_GraphicsSetSmoothingMode hat auf jeden fall schon etwas geholfen.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")
    _GDIPlus_Startup()
    Global $iSpeed = 5

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

    Global $iDegToRad = 3.14159265358979 / 180
    Global $iWidth = 800, $iHeight = 200
    $GUI_Back_Color = 0xF0F0F0

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

    Dim $aLine[43][2] = [[42, ""],[0 - 10, $iHeight + 10]] ; Array mit koordinaten für _GDIPlus_Graphicsdrawcurve
    For $i = 2 To UBound($aLine) - 2
    $aLine[$i][0] = ($i - 1) * 20
    $aLine[$i][1] = $iHeight / 1.5 + Sin(($i - 1) * Random(10, 30, 1) * $iDegToRad) * 100
    Next
    $aLine[42][0] = $iWidth - 10
    $aLine[42][1] = $iHeight + 10

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

    ;~ _ArrayDisplay($aLine)

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

    $hGUI = GUICreate("", $iWidth, $iHeight)
    GUISetOnEvent(-3, "OnEvent_Eventhandler")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $GUI_Back_Color)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    GUISetState()
    While 1 * Sleep(10)
    Local $iUbound = UBound($aLine)
    For $i = 2 To $iUbound - 3 ; Alle außer die Eckpunkten ul & ur
    $aLine[$i][0] = $aLine[$i][0] - $iSpeed ; geschwindigkeit von X-Koordinate abziehen (Bewegung links)
    Next

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

    If $aLine[2][0] <= 0 Then ; Wenn erster richtiger punkt X <= 0 hat, dann
    For $i = 2 To $iUbound - 3
    $aLine[$i][1] = $aLine[$i + 1][1] ; Alle punkte im Array eins nach oben schieben,
    $aLine[$i][0] = $aLine[$i + 1][0]
    Next
    $aLine[$iUbound - 2][1] = $iHeight / 1.5 + Sin(($iUbound - 2) * Random(10, 30, 1) * $iDegToRad) * 100 ; Und neue Koordinate einfügen (Sonst ist die bewegung vorbei, wenn 1x alle punkte durch sind)
    EndIf
    ;~ _ArrayDisplay($aLine)
    WM_PAINT()
    WEnd

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

    Func OnEvent_Eventhandler()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc ;==>OnEvent_Eventhandler

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

    Func WM_PAINT()
    _GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000 + $GUI_Back_Color)
    ;~ _GDIPlus_GraphicsDrawClosedCurve($hBackbuffer, $aLine)
    _GDIPlus_GraphicsFillClosedCurve($hBackbuffer, $aLine)
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

    [/autoit]

    Hintergrund des ganzen war eigentlich, dass ich das hier besser hinbekomme (das ist ziemlich zusammengeschustert, und sieht mehr lustig als cool aus. Aber ich bin Anfänger - ich darf das :D)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")
    _GDIPlus_Startup()

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

    Global $iWidth = 600, $iHeight = 300
    $iWidth = 50 * Floor($iWidth / 50)
    $iHeight = 50 * Floor($iHeight / 50)
    $GUI_Back_Color = 0x7BEAFD

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

    $iLast = 175
    Dim $aLine[(($iWidth + 50) / 50) + 1][2]
    $aLine[0][0] = (($iWidth + 50) / 50)

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

    For $i = 0 To (($iWidth + 50) / 50) - 1 ; Bergspitzen random bestimmen
    _Often("$iLast")
    $aLine[$i + 1][0] = $i * 50
    $aLine[$i + 1][1] = $iLast
    Next

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

    $hGUI = GUICreate("", $iWidth, $iHeight)
    GUISetOnEvent(-3, "OnEvent_Eventhandler")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $GUI_Back_Color)
    $hGreenBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + 0x4FE369)
    $hGreyBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + 0x959595)
    $hYellowBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + 0xFFFF1C)
    $hOrangeBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + 0xFCE074)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    GUISetState()
    While 1 * Sleep(200)
    _MoveGreen()
    WEnd

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

    Func OnEvent_Eventhandler()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc ;==>OnEvent_Eventhandler

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

    Func WM_PAINT()
    _GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000 + $GUI_Back_Color)

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

    _GDIPlus_GraphicsFillEllipse($hBackbuffer, 5, 5, 110, 110, $hOrangeBrush) ; Sonne malen
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, 10, 10, 100, 100, $hYellowBrush)

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

    _Berge_malen("Rand")
    _Berge_malen("Innen")

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

    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    ;~ Func __GDIPlus_StartUp()
    ;~ EndFunc

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BrushDispose($hGreyBrush)
    _GDIPlus_BrushDispose($hGreenBrush)
    _GDIPlus_BrushDispose($hYellowBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

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

    Func _MoveGreen()
    Local $iUbound = UBound($aLine)
    For $i = 1 To $iUbound - 2
    $aLine[$i][1] = $aLine[$i + 1][1]
    ;~ $aLine[$i][0] = $aLine[$i+1][0]
    Next
    _Often("il")
    $aLine[$iUbound - 1][1] = $iLast
    WM_PAINT()
    ;~ For $i = 0 To (($iWidth + 50) / 50) - 1 ; Bergspitzen random bestimmen
    ;~ $aLine[$i + 1][0] = $i * 50
    ;~ $aLine[$i + 1][1] = $iLast
    ;~ Next
    EndFunc ;==>_MoveGreen

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

    Func _Often($sWhat)
    Switch $sWhat
    Case "$iLast", "iLast", "il"
    $iRnd = Random(0, 10, 1) ; 50 / 50 Chance
    $iRnd2 = Random(10, 30, 1) ; Steigung
    $iLast += 0 + (($iRnd >= 5) * $iRnd2) - (($iRnd < 5) * $iRnd2)
    If $iLast > 200 Then $iLast = 200
    If $iLast < 100 Then $iLast = 100
    EndSwitch
    EndFunc ;==>_Often

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

    Func _Berge_malen($sWhat)
    Switch $sWhat
    Case "rand"
    For $i = 1 To UBound($aLine) - 1 ; Berge malen (Rand)
    $iLX = 0 + ($aLine[$i][0] > $iWidth / 2) * ($iWidth / 2) ; X koordinate links unten
    $iRX = $iLX + ($iWidth / 2) ; X koordinate rechts unten
    Dim $aPoints[4][2] = [[3, ""],[$iLX, $iHeight],[$aLine[$i][0], $aLine[$i][1] - 10],[$iRX, $iHeight]]

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

    If $aLine[$i][0] = $iWidth / 2 Then
    Dim $aPoints[4][2] = [[3, ""],[$iWidth * 0.25, $iHeight],[$aLine[$i][0], $aLine[$i][1] - 10],[$iWidth * 0.75, $iHeight]]
    EndIf
    _GDIPlus_GraphicsFillPolygon($hBackbuffer, $aPoints, $hGreyBrush)
    Next
    Case "innen"
    For $i = 1 To UBound($aLine) - 1 ; Berge malen (Innen)
    $iLX = 0 + ($aLine[$i][0] > $iWidth / 2) * ($iWidth / 2) ; X koordinate links unten
    $iRX = $iLX + ($iWidth / 2) ; X koordinate rechts unten
    Dim $aPoints[4][2] = [[3, ""],[$iLX, $iHeight],[$aLine[$i][0], $aLine[$i][1]],[$iRX, $iHeight]]

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

    If $aLine[$i][0] = $iWidth / 2 Then
    Dim $aPoints[4][2] = [[3, ""],[$iWidth * 0.25, $iHeight],[$aLine[$i][0], $aLine[$i][1]],[$iWidth * 0.75, $iHeight]]
    EndIf
    _GDIPlus_GraphicsFillPolygon($hBackbuffer, $aPoints, $hGreenBrush)
    Next
    EndSwitch
    EndFunc ;==>_Berge_malen

    [/autoit]

    Naja wenn wem noch was einfällt: immer her damit :D


    @Prog@andy:
    Na dann bin ich mal gespannt wie das mit scrollen aussieht. würd mir sehr helfen.
    (Am besten wenn der untere Bereich gefüllt ist :D)

  • @Prog@andy:
    Na dann bin ich mal gespannt wie das mit scrollen aussieht. würd mir sehr helfen.
    (Am besten wenn der untere Bereich gefüllt ist :D)


    Das wäre die Scrollende Sinus-Funktion, bei mir flackert es nicht.:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    $hGUI = GUICreate("Sinuskurve", 640, 480)
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    Global $iStep = 3 ; Pixelversatz pro Zeichenvorgang
    Global $iPenColor = 0xFFFF0000
    Global $iBrushColor = 0xFF00FFFF
    Global $iBackColor = 0xFFF8F8F8

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBackBuffer = _GDIPlus_BitmapCreateFromGraphics(640, 480, $hGraphic)
    $hBackGraphic = _GDIPlus_ImageGetGraphicsContext($hBackBuffer)
    $hPen = _GDIPlus_PenCreate($iPenColor, 2)
    $hBrush = _GDIPlus_BrushCreateSolid($iBrushColor)
    OnAutoItExitRegister("_Clear")

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

    ; berechnen
    Local $pi = 3.14159265358979
    Local $degToRad = $pi / 180
    Local $aPoints[641][2] =[[640]], $aClosedPoints[643][2]=[[642]]
    For $i = 0 To 639
    $aPoints[$i+1][0] = $i
    $aPoints[$i+1][1] = 240 + (Sin($i*$degToRad) * 100)
    $aClosedPoints[$i+2][0] = $i
    $aClosedPoints[$i+2][1] = $aPoints[$i+1][1]
    Next
    $aClosedPoints[1][0] = 0
    $aClosedPoints[1][1] = 480
    $aClosedPoints[642][0] = 640
    $aClosedPoints[642][1] = 480

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

    ; Zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackGraphic, 2)
    _GDIPlus_GraphicsClear($hBackGraphic, $iBackColor)
    _GDIPlus_GraphicsFillClosedCurve($hBackGraphic, $aClosedPoints, $hBrush)
    _GDIPlus_GraphicsDrawCurve($hBackGraphic, $aPoints, $hPen)

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

    AdlibRegister("_MoveCurve", 20)
    GUISetState()
    Do
    Until GUIGetMsg() = -3

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

    Func _MoveCurve()
    Local Static $index = 640
    For $i = 1 To 640-$iStep
    ; alte Werte verschieben
    $aPoints[$i][1] = $aPoints[$i+$iStep][1]
    $aClosedPoints[$i+1][1] = $aPoints[$i+$iStep][1]
    Next
    For $i = 1 To $iStep
    ; neue Werte berechnen
    $index += 1
    If $index=720 Then $index = 0
    $aPoints[640-$iStep+$i][1] = 240 + (Sin($index*$degToRad) * 100)
    $aClosedPoints[641-$iStep+$i][1] = $aPoints[640-$iStep+$i][1]
    Next
    _GDIPlus_GraphicsClear($hBackGraphic, $iBackColor)
    _GDIPlus_GraphicsSetSmoothingMode($hBackGraphic, 0)
    _GDIPlus_GraphicsFillClosedCurve($hBackGraphic, $aClosedPoints, $hBrush)
    _GDIPlus_GraphicsSetSmoothingMode($hBackGraphic, 2)
    _GDIPlus_GraphicsDrawCurve($hBackGraphic, $aPoints, $hPen)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    EndFunc

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

    Func _Clear()
    ; Ressourcen freigeben
    _GDIPlus_GraphicsDispose($hBackGraphic)
    _GDIPlus_BitmapDispose($hBackBuffer)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    EndFunc

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

    Func WM_PAINT()
    ; auf GUI zeichnen
    _GDIPlus_GraphicsDrawImage($hGraphic, $hBackBuffer, 0, 0)
    EndFunc ;==>WM_PAINT

    [/autoit]
  • Oh ha. Die 20ms bei AdlibRegister sind aber riskant. Mein alter BüroPC (Athlon XP 2600 @1,9 GHZ) schafft das nichmehr.
    Bei 40ms läufts und schaut gut aus. :thumbup:

    edit \ Am besten ab in die Schleife mit der Funktion oder?

    Einmal editiert, zuletzt von nuts (11. März 2010 um 15:03)

  • Oh ha. Die 20ms bei AdlibRegister sind aber riskant. Mein alter BüroPC (Athlon XP 2600 @1,9 GHZ) schafft das nichmehr.
    Bei 40ms läufts und schaut gut aus. :thumbup:

    edit \ Am besten ab in die Schleife mit der Funktion oder?

    Mit 20ms stürzt das Script einfach ab bei mir 21:09:28 AutoIT3.exe ended.rc:1073807364

    Mit 40ms läuft es.

    Dabei hab ich gar keinen schlechten PC.

  • Hat mir echt alles weitergeholfen, danke Prog@ndy.

    Habs jetzt mal abgeändert nachgebaut, und es klappt. Perfekt

    PS: Und nochmal danke für Static. Ich hatte zwar schonmal was drüber gelesen, aber jetzt weiß ich endlich mal was die besonderheit an Static Variablen ist.

    Und die sind ja mal geil praktisch :O

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")

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

    Global $iWidth = 400, $iHeight = 200
    $iSteigung = 25

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

    $hGUI = GUICreate("Sonnenuntergang", $iWidth, $iHeight)
    GUISetOnEvent(-3, "OnEvent_Eventhandler")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    _GDIPlus_Startup()
    $iGUI_Back_Color = 0xFFF0F0F0
    $iBrushColor = 0xFF61ED6B
    $iPenColor = 0xFF35911E
    $iSkyColor = 0xFFA4F4FB
    Global $aClosedCurve, $aCurve, $aSun

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid($iBrushColor)
    $hBrushSky = _GDIPlus_BrushCreateSolid($iSkyColor)
    $hYellowBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + 0xFFFF1C)
    $hOrangeBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + 0xFCE074)
    $hPen = _GDIPlus_PenCreate($iPenColor, 3)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    _Draw()

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

    GUISetState()
    While 1 * Sleep(10)
    _MoveGround()
    WEnd

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

    Func OnEvent_Eventhandler()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc ;==>OnEvent_Eventhandler

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

    Func _MoveGround()
    Local $iStep = 2
    Local Static $iIndex = $iWidth
    Local $iDegToRad = 3.14159265358979 / 180
    ;~ _GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000 + $GUI_Back_Color)
    For $i = 1 To $iWidth - $iStep
    $aClosedCurve[$i + 1][1] = $aClosedCurve[$i + 1 + $iStep][1]
    $aCurve[$i][1] = $aClosedCurve[$i + $iStep][1]
    Next
    For $i = 1 To $iStep
    $iIndex += 1
    If $iIndex >= $iWidth * 1.125 Then $iIndex = $iWidth

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

    ;Steigung berechnen
    $iSteigung = Random($iSteigung - 5, $iSteigung + 5, 1)
    If $iSteigung <= 10 Then $iSteigung = 25
    If $iSteigung >= 60 Then $iSteigung = 30
    ;~ ConsoleWrite($iSteigung & @CRLF)
    ;~ ConsoleWrite($iIndex & @CRLF)

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

    $aCurve[$iWidth - $iStep + $i][1] = ($iHeight * 0.5) + (Sin($iIndex * $iDegToRad) * $iSteigung)
    $aClosedCurve[$iWidth + 1 - $iStep + $i][1] = $aCurve[$iWidth - $iStep + $i][1]
    Next
    ;~ _ArrayDisplay($aClosedCurve)

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

    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    _GDIPlus_GraphicsClear($hBackbuffer, $iSkyColor)

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

    _MoveSonne()

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

    _GDIPlus_GraphicsFillClosedCurve($hBackbuffer, $aClosedCurve, $hBrush)
    _GDIPlus_GraphicsDrawCurve($hBackbuffer, $aCurve, $hPen)

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

    _Dunkel()
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    EndFunc ;==>_MoveGround

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

    Func _MoveSonne()
    Local Static $iCalls = 0
    Local $iStepX = 0.5, $iStepY = 1
    $iCalls += 1
    If $iCalls = 2 Then
    $aSun[0][0] += $iStepX
    $aSun[0][1] += $iStepY
    $aSun[1][0] += $iStepX
    $aSun[1][1] += $iStepY
    $iCalls = 0
    EndIf

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

    ;~ ConsoleWrite($iCalls & @CRLF)
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, $aSun[0][0], $aSun[0][1], 110, 110, $hOrangeBrush) ; Sonne malen
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, $aSun[1][0], $aSun[1][1], 100, 100, $hYellowBrush)
    EndFunc ;==>_MoveSonne

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

    Func _Dunkel()
    Local Static $iDark = 0x00000000, $iCalls = 0
    $iCalls += 1
    If $iCalls = 3 Then
    Local $iCurrent = $iDark
    If $iCurrent < 2500000000 Then
    $iDark += 0x01000000
    ;~ ConsoleWrite($iDark & @CRLF)
    Else
    MsgBox(0,"","Jetzt ist es dunkel! Du solltest schon lange im Bett sein!")
    Exit
    EndIf
    $iCalls = 0
    EndIf

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

    $hDarkBrush = _GDIPlus_BrushCreateSolid($iDark)
    _GDIPlus_GraphicsFillRect($hBackbuffer, 0, 0, $iWidth, $iHeight, $hDarkBrush)
    _GDIPlus_BrushDispose($hDarkBrush)

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

    EndFunc ;==>_Dunkel

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

    Func _Draw()
    Local $iDegToRad = 3.14159265358979 / 180
    Dim $aClosedCurve[$iWidth + 3][2] = [[$iWidth + 2]]
    Dim $aCurve[$iWidth + 1][2] = [[$iWidth]]
    For $i = 1 To $iWidth
    $iSteigung = Random($iSteigung - 5, $iSteigung + 5, 1)
    If $iSteigung <= 10 Then $iSteigung = 25
    If $iSteigung >= 40 Then $iSteigung = 25
    $aClosedCurve[$i + 1][0] = $i
    $aClosedCurve[$i + 1][1] = ($iHeight * 0.5) + (Sin($i * $iDegToRad) * $iSteigung)
    $aCurve[$i][0] = $i
    $aCurve[$i][1] = ($iHeight * 0.5) + (Sin($i * $iDegToRad) * $iSteigung)
    Next
    $aClosedCurve[1][0] = 0
    $aClosedCurve[1][1] = $iHeight
    $aClosedCurve[$iWidth + 2][0] = $iWidth
    $aClosedCurve[$iWidth + 2][1] = $iHeight

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

    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    _GDIPlus_GraphicsClear($hBackbuffer, $iSkyColor)

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

    Dim $aSun[2][5] = [[5, 5, 110, 110, True],[10, 10, 100, 100, True]]
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, 5, 5, 110, 110, $hOrangeBrush) ; Sonne malen
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, 10, 10, 100, 100, $hYellowBrush)

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

    _GDIPlus_GraphicsFillClosedCurve($hBackbuffer, $aClosedCurve, $hBrush)
    _GDIPlus_GraphicsDrawCurve($hBackbuffer, $aCurve, $hPen)

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

    ;~ WM_PAINT()
    EndFunc ;==>_Draw

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

    Func WM_PAINT()
    ;~ _GDIPlus_GraphicsClear($hBackbuffer, $iGUI_Back_Color)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

    [/autoit]