GDI+ "Springy"

  • Ich bin mir nicht ganz sicher was das sein könnte (daher auch der seltsame Name), aber es ist irgendwie ganz lustig. :D
    Mit der linken Maustaste verändert ihr die Position des Kreises.
    Die Zahlen von 1 - 0 verändern die Positionen der Bezugspunkte.
    Mit Strg + s öffnet ihr das Einstellungsmenü.
    Alle Einstellungen werden in einer Datei gespeichert.
    Hoffe es gefällt euch. :thumbup:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $iGUIColorBG = 0xFFFFFFFF
    $iGUIWidth = 400
    $iGUIHeight = 400

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

    $hWndMain = GUICreate("Springy by name22 (autoit.de)", $iGUIWidth, $iGUIHeight)
    GUISetState()

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

    $hWndSettings = GUICreate("Einstellungen", 190, 180, 192, 124)
    $cSpringNr = GUICtrlCreateInput("Feder Nr", 8, 8, 81, 21, 0x2000)
    GUICtrlSetLimit($cSpringNr, 2, 1)
    $cSpringNrUD = GUICtrlCreateUpdown($cSpringNr)
    GUICtrlSetLimit($cSpringNrUD, 10, 1)
    $cLabel1 = GUICtrlCreateLabel("Farbe:", 8, 48, 34, 17)
    $cColorShow = GUICtrlCreateLabel("", 8, 72, 71, 25)
    $cState = GUICtrlCreateCheckbox("Aktiv", 136, 16, 49, 17)
    $cStrength = GUICtrlCreateInput("", 8, 136, 81, 21, 0x2000)
    GUICtrlSetLimit($cStrength, 3, 1)
    $cLabel2 = GUICtrlCreateLabel("Stärke:", 8, 112, 36, 17)

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWndMain)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

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

    $hFormatNumber = _GDIPlus_StringFormatCreate()
    $hFamilyNumbers = _GDIPlus_FontFamilyCreate("Arial")
    $hFontNumbers = _GDIPlus_FontCreate($hFamilyNumbers, 14)

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

    $hBrushNumbers = _GDIPlus_BrushCreateSolid(0xFF000000)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hWndMain)
    GUISetOnEvent($GUI_EVENT_RESTORE, "WM_PAINT", $hWndMain)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    $iX = 200
    $iY = 200
    $vX = 0
    $vY = 0
    $Resistance = 0.93

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

    If FileExists(@ScriptDir & "\Data") Then
    $aSpringCoords = _LoadFromFile()
    Else
    Global $aSpringCoords[11][5]
    $aSpringCoords[0][0] = 10

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

    For $i = 1 To $aSpringCoords[0][0]
    $aSpringCoords[$i][0] = Random(0, $iGUIWidth, 1)
    $aSpringCoords[$i][1] = Random(0, $iGUIHeight, 1)
    $aSpringCoords[$i][2] = _GDIPlus_PenCreate(0xFF000000, 2)
    $aSpringCoords[$i][3] = True
    $aSpringCoords[$i][4] = 30
    Next
    EndIf

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

    HotKeySet("^s", "_ShowSettings")

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

    While Sleep(10)
    $iX += $vX
    $iY += $vY
    $vX *= $Resistance
    $vY *= $Resistance

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

    _GDIPlus_GraphicsClear($hBuffer, $iGUIColorBG)

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

    $aMousePos = GUIGetCursorInfo($hWndMain)
    If _IsPressed("01") Then
    $iX = $aMousePos[0]
    $iY = $aMousePos[1]
    EndIf
    For $i = 30 To 39
    If _IsPressed($i) Then
    $aSpringCoords[$i - 29][0] = $aMousePos[0]
    $aSpringCoords[$i - 29][1] = $aMousePos[1]
    EndIf
    Next
    For $i = 1 To $aSpringCoords[0][0]
    If $aSpringCoords[$i][3] Then
    $vX += ($aSpringCoords[$i][0] - $iX) / (100 - $aSpringCoords[$i][4])
    $vY += ($aSpringCoords[$i][1] - $iY) / (100 - $aSpringCoords[$i][4])
    _GDIPlus_GraphicsDrawLine($hBuffer, $aSpringCoords[$i][0], $aSpringCoords[$i][1], $iX, $iY, $aSpringCoords[$i][2])
    $aInfo = _GDIPlus_GraphicsMeasureString($hBuffer, $i - 1, $hFontNumbers, _GDIPlus_RectFCreate(), $hFormatNumber)
    $iWidthTmp = DllStructGetData($aInfo[0], "width")
    $iHeightTmp = DllStructGetData($aInfo[0], "height")
    Select
    Case $aSpringCoords[$i][0] <= $iX And $aSpringCoords[$i][1] <= $iY
    $tRectF = _GDIPlus_RectFCreate($aSpringCoords[$i][0] - $iWidthTmp, $aSpringCoords[$i][1] - $iHeightTmp)
    Case $aSpringCoords[$i][0] >= $iX And $aSpringCoords[$i][1] <= $iY
    $tRectF = _GDIPlus_RectFCreate($aSpringCoords[$i][0], $aSpringCoords[$i][1] - $iHeightTmp)
    Case $aSpringCoords[$i][0] <= $iX And $aSpringCoords[$i][1] >= $iY
    $tRectF = _GDIPlus_RectFCreate($aSpringCoords[$i][0] - $iWidthTmp, $aSpringCoords[$i][1])
    Case $aSpringCoords[$i][0] >= $iX And $aSpringCoords[$i][1] >= $iY
    $tRectF = _GDIPlus_RectFCreate($aSpringCoords[$i][0], $aSpringCoords[$i][1])
    EndSelect
    _GDIPlus_GraphicsDrawStringEx($hBuffer, $i - 1, $hFontNumbers, $tRectF, $hFormatNumber, $hBrushNumbers)
    _GDIPlus_GraphicsDrawRect($hBuffer, DllStructGetData($tRectF, "x"), DllStructGetData($tRectF, "y"), $iWidthTmp, $iHeightTmp, $aSpringCoords[$i][2])
    EndIf
    Next

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

    _GDIPlus_GraphicsFillEllipse($hBuffer, $iX - 20, $iY - 20, 40, 40)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    WEnd

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

    Func _ShowSettings()
    Opt("GUIOnEventMode", 0)
    GUISetState(@SW_SHOW, $hWndSettings)
    $iSpringNrTmp = 1

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Opt("GUIOnEventMode", 1)
    GUISetState(@SW_HIDE, $hWndSettings)
    Return _SaveToFile()
    Case $cSpringNr
    $iSpringNrTmp = GUICtrlRead($cSpringNr)
    Select
    Case $iSpringNrTmp > 10
    $iSpringNrTmp = 10
    Case $iSpringNrTmp < 1
    $iSpringNrTmp = 1
    EndSelect
    GUICtrlSetBkColor($cColorShow, StringTrimLeft(Hex(_GDIPlus_PenGetColor($aSpringCoords[$iSpringNrTmp][2])), 3))
    GUICtrlSetData($cStrength, $aSpringCoords[$iSpringNrTmp][4])
    If $aSpringCoords[$iSpringNrTmp][3] Then
    GUICtrlSetState($cState, $GUI_CHECKED)
    Else
    GUICtrlSetState($cState, $GUI_UNCHECKED)
    EndIf
    Case $cColorShow
    $iColorRGB = StringTrimLeft(_ChooseColor(2), 2)
    _GDIPlus_PenSetColor($aSpringCoords[$iSpringNrTmp][2], "0xFF" & $iColorRGB)
    GUICtrlSetBkColor($cColorShow, "0x" & $iColorRGB)
    Case $cState
    If $aSpringCoords[$iSpringNrTmp][3] Then
    $aSpringCoords[$iSpringNrTmp][3] = False
    Else
    $aSpringCoords[$iSpringNrTmp][3] = True
    EndIf
    Case $cStrength
    $iStrengthTmp = GUICtrlRead($cStrength)
    Select
    Case $iStrengthTmp > 80
    $iStrengthTmp = 80
    Case $iStrengthTmp < 1
    $iStrengthTmp = 1
    EndSelect
    GUICtrlSetData($cStrength, $iStrengthTmp)
    $aSpringCoords[$iSpringNrTmp][4] = $iStrengthTmp
    EndSwitch
    WEnd
    EndFunc ;==>_ShowSettings

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc ;==>WM_PAINT

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

    Func _LoadFromFile()
    $sText = FileRead(@ScriptDir & "\Data")
    $aSplitTmp = StringSplit($sText, "|")

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

    Local $aReturn[$aSplitTmp[0] + 1][5]
    $aReturn[0][0] = $aSplitTmp[0]

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

    For $i = 1 To $aSplitTmp[0]
    $aSplitTmp2 = StringSplit($aSplitTmp[$i], ",", 2)
    $aReturn[$i][0] = $aSplitTmp2[0]
    $aReturn[$i][1] = $aSplitTmp2[1]
    $aReturn[$i][2] = "0x" & Hex(_GDIPlus_PenCreate($aSplitTmp2[2], 2))
    Switch $aSplitTmp2[3]
    Case "True"
    $aReturn[$i][3] = True
    Case "False"
    $aReturn[$i][3] = False
    EndSwitch
    $aReturn[$i][4] = $aSplitTmp2[4]
    Next
    Return $aReturn
    EndFunc ;==>_LoadFromFile

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

    Func _SaveToFile()
    $sString = ""

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

    For $i = 1 To $aSpringCoords[0][0]
    $sString &= $aSpringCoords[$i][0] & "," & $aSpringCoords[$i][1] & "," & _GDIPlus_PenGetColor($aSpringCoords[$i][2]) & "," & $aSpringCoords[$i][3] & "," & $aSpringCoords[$i][4] & "|"
    Next
    $hFile = FileOpen(@ScriptDir & "\Data", 2)
    FileWrite($hFile, StringTrimRight($sString, 2))
    FileClose($hFile)
    EndFunc

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    For $i = 1 To $aSpringCoords[0][0]
    _GDIPlus_PenDispose($aSpringCoords[$i][2])
    Next
    _GDIPlus_StringFormatDispose($hFormatNumber)
    _GDIPlus_FontDispose($hFontNumbers)
    _GDIPlus_FontFamilyDispose($hFamilyNumbers)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Ich find das "Spiel" cool, und die Idee mit den zwei Kreisen kannst du auch verwirklichen.
    Vielleicht stellst du es auch ein, dass die Kugeln nicht über den Rand hinaus können, und sich gegenseitig wegschlagen.

    Viele Grüße,
    HopFail

  • gibts auch ne funktion

    Spoiler anzeigen
    [autoit]

    Func KollisionReaktionKugeln($Kugel1_ID, $Kugel2_ID)
    Local $x = ($Kugel_Center_x[$Kugel1_ID] + $Kugel_Center_x[$Kugel2_ID]) / 2
    Local $y = ($Kugel_Center_y[$Kugel1_ID] + $Kugel_Center_y[$Kugel2_ID]) / 2
    Local $delta_x = $Kugel_Center_x[$Kugel1_ID] - $Kugel_Center_x[$Kugel2_ID]
    Local $delta_y = $Kugel_Center_y[$Kugel1_ID] - $Kugel_Center_y[$Kugel2_ID]
    Local $distanz = Sqrt($delta_x*$delta_x + $delta_y*$delta_y)
    Local $mtd_x = $delta_x / $distanz
    Local $mtd_y = $delta_y / $distanz
    Local $r1_x = $x - $Kugel_Center_x[$Kugel1_ID] ; X Abstand Körper1 vom Körpermittelpunkt zum Kollisionspunkt
    Local $r1_y = $y - $Kugel_Center_y[$Kugel1_ID] ; Y Abstand Körper1 vom Körpermittelpunkt zum Kollisionspunkt
    Local $r2_x = $x - $Kugel_Center_x[$Kugel2_ID] ; X Abstand Körper2 vom Körpermittelpunkt zum Kollisionspunkt
    Local $r2_y = $y - $Kugel_Center_y[$Kugel2_ID] ; Y Abstand Körper2 vom Körpermittelpunkt zum Kollisionspunkt
    Local $v_1p_x = $Kugel_Vektor_x[$Kugel1_ID] - $Kugel_Omega[$Kugel1_ID]*$r1_y ; X Geschwindigkeit + X Rotationsgeschwindigkeit Körper 1
    Local $v_1p_y = $Kugel_Vektor_y[$Kugel1_ID] + $Kugel_Omega[$Kugel1_ID]*$r1_x ; Y Geschwindigkeit + Y Rotationsgeschwindigkeit Körper 1
    Local $v_2p_x = $Kugel_Vektor_x[$Kugel2_ID] - $Kugel_Omega[$Kugel2_ID]*$r2_y ; X Geschwindigkeit + X Rotationsgeschwindigkeit Körper 2
    Local $v_2p_y = $Kugel_Vektor_y[$Kugel2_ID] + $Kugel_Omega[$Kugel2_ID]*$r2_x ; Y Geschwindigkeit + Y Rotationsgeschwindigkeit Körper 2
    Local $v_12 = ($v_1p_x - $v_2p_x) * $mtd_x + ($v_1p_y - $v_2p_y) * $mtd_y
    If $v_12 < 0 Then
    Local $ja, $jb, $jc, $jd, $je
    $ja = (-(1+($Kugel_Stoszzahl[$Kugel1_ID] + $Kugel_Stoszzahl[$Kugel2_ID])/2) * $v_12)
    $jb = ($mtd_x*$mtd_x + $mtd_y*$mtd_y)*($mtd_x*$mtd_x + $mtd_y*$mtd_y)
    If $Kugel_Masse[$Kugel1_ID] <> 0 And $Kugel_Masse[$Kugel2_ID] <> 0 Then
    $jc = (1/$Kugel_Masse[$Kugel1_ID] + 1/$Kugel_Masse[$Kugel2_ID])
    ElseIf $Kugel_Masse[$Kugel1_ID] = 0 And $Kugel_Masse[$Kugel2_ID] = 0 Then
    $jc = 0
    ElseIf $Kugel_Masse[$Kugel1_ID] = 0 Then
    $jc = 1/$Kugel_Masse[$Kugel2_ID]
    Else
    $jc = 1/$Kugel_Masse[$Kugel1_ID]
    EndIf
    If $Kugel_Flaechentraegheitsmoment[$Kugel1_ID] <> 0 Then
    $jd = ($r1_x*$mtd_y - $r1_y*$mtd_x) * ($r1_x*$mtd_y - $r1_y*$mtd_x)/$Kugel_Flaechentraegheitsmoment[$Kugel1_ID]
    Else
    $jd = 0
    EndIf
    If $Kugel_Flaechentraegheitsmoment[$Kugel2_ID] <> 0 Then
    $je = ($r2_x*$mtd_y - $r2_y*$mtd_x) * ($r2_x*$mtd_y - $r2_y*$mtd_x)/$Kugel_Flaechentraegheitsmoment[$Kugel2_ID]
    Else
    $je = 0
    EndIf
    Local $j = $ja / ($jb*$jc + $jd + $je)
    If $Kugel_Masse[$Kugel1_ID] <> 0 Then
    $Kugel_Vektor_x[$Kugel1_ID] += $j / $Kugel_Masse[$Kugel1_ID] * $mtd_x
    $Kugel_Vektor_y[$Kugel1_ID] += $j / $Kugel_Masse[$Kugel1_ID] * $mtd_y
    EndIf
    If $Kugel_Masse[$Kugel2_ID] <> 0 Then
    $Kugel_Vektor_x[$Kugel2_ID] -= $j / $Kugel_Masse[$Kugel2_ID] * $mtd_x
    $Kugel_Vektor_y[$Kugel2_ID] -= $j / $Kugel_Masse[$Kugel2_ID] * $mtd_y
    EndIf
    If $Kugel_Flaechentraegheitsmoment[$Kugel1_ID] <> 0 Then $Kugel_Omega[$Kugel1_ID] += ($r1_x*$j*$mtd_y - $r1_y*$j*$mtd_x) / $Kugel_Flaechentraegheitsmoment[$Kugel1_ID]
    If $Kugel_Flaechentraegheitsmoment[$Kugel2_ID] <> 0 Then $Kugel_Omega[$Kugel2_ID] += ($r2_x*-$j*$mtd_y - $r2_y*-$j*$mtd_x) / $Kugel_Flaechentraegheitsmoment[$Kugel2_ID]
    EndIf
    EndFunc

    [/autoit]


    physik engine is echt geil :thumbup:

  • geile sache das :thumbup:
    hab nen kleinen bug gefunden nix schlimmes die feder "0" ist im einstellungsmenü die feder "1" und die feder "2" ist im menü "3" bei den anderen ist mir nix aufgefallen