Physik Engine (aktualisiert)

  • Hi,

    das hier ist meine Physikengine.

    Eine Hilfe mit genauer Anleitung ist enthalten.

    Hoffe auf Kritik.

    MfG mazZ :)

    Spoiler anzeigen
    [autoit]


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

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

    Opt("GUIOnEventMode",1)
    Opt("MouseCoordMode",2)
    Global $iWidth = 500
    Global $iHeight = 500
    Global $krl = 100
    Global $alpha = 0
    Global $strenght = 1
    Global $nullx = $iWidth/2
    Global $nully = $iHeight/2
    Global $kugelx = $nullx
    Global $kugely = $nully
    Global $kWidth = $iWidth/50
    Global $kHeight = $iWidth/50
    Global $kzahl = 0
    Global $t = 0
    Global $m = 1
    Global $g = 9.81
    Global $lWidth = $iWidth
    Global $lHeight = $iHeight/1.25
    Global $k1Width = $iWidth/10
    Global $k1Height = $iHeight/10
    Global $k2Width = $iWidth/10
    Global $k2Height = $iHeight/10
    Global $kugel1x = 0
    Global $kugel1y = $lHeight - 10
    Global $kugel2x = $iWidth - 10
    Global $kugel2y = $lHeight - 10
    Global $kugel1step = 0
    Global $kugel2step = 0
    Global $eWidth = 200
    Global $eHeight = 200
    Global $startstop = 0

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

    $hWnd = GUICreate("Physic Engine",$iWidth,$iHeight,-1,-1)
    GUISetState(@SW_SHOW)
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth,$iHeight,$hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hPenrot = _GDIPlus_PenCreate(0xFFFF0000)
    $hPengruen = _GDIPlus_PenCreate(0xFF00FF00)
    $hBrushrot = _GDIPlus_BrushCreateSolid(0xFFFF0000)
    $hBrushgruen = _GDIPlus_BrushCreateSolid(0xFF00FF00)
    GUISetOnEvent(-3,"_exit")
    HotKeySet("h","_hilfe")

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

    MsgBox(0,"Hinweis","Für die Hilfe h drücken.")
    AdlibRegister("_menu",10)

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

    While 1
    WEnd
    Func _menu()
    _GDIPlus_GraphicsClear($hBuffer,0xFF555555)
    _GDIPlus_GraphicsFillRect($hBuffer,$iWidth/4,$iHeight/4,$iWidth/2,$iHeight/10,$hBrushgruen)
    _GDIPlus_GraphicsDrawString($hBuffer,"Kanone",$iWidth/4 + $iWidth/4 - $iWidth/16,$iHeight/4 + $iHeight/32)
    If MouseGetPos(0) > $iWidth/4 And MouseGetPos(0) < $iWidth*0.75 And MouseGetPos(1) > $iHeight/4 And MouseGetPos(1) < $iHeight*(7/20) Then _GDIPlus_GraphicsDrawRect($hBuffer,$iWidth/4,$iHeight/4,$iWidth/2,$iHeight/10,$hPenrot)
    If MouseGetPos(0) > $iWidth/4 And MouseGetPos(0) < $iWidth*0.75 And MouseGetPos(1) > $iHeight/4 And MouseGetPos(1) < $iHeight*(7/20) And _IsPressed("01") Then
    AdlibUnRegister("_menu")
    _menukanone()
    EndIf

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

    _GDIPlus_GraphicsFillRect($hBuffer,$iWidth/4,$iHeight/2,$iWidth/2,$iHeight/10,$hBrushgruen)
    _GDIPlus_GraphicsDrawString($hBuffer,"Kugeln",$iWidth/4 + $iWidth/4 - $iWidth/16,$iHeight/2 + $iHeight/32)
    If MouseGetPos(0) > $iWidth/4 And MouseGetPos(0) < $iWidth*0.75 And MouseGetPos(1) > $iHeight/2 And MouseGetPos(1) < $iHeight*0.6 Then _GDIPlus_GraphicsDrawRect($hBuffer,$iWidth/4,$iHeight/2,$iWidth/2,$iHeight/10,$hPenrot)
    If MouseGetPos(0) > $iWidth/4 And MouseGetPos(0) < $iWidth*0.75 And MouseGetPos(1) > $iHeight/2 And MouseGetPos(1) < $iHeight*0.6 And _IsPressed("01")Then
    AdlibUnRegister("_menu")
    _menukugeln()
    EndIf

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$iWidth,$iHeight)
    EndFunc
    Func _menukanone()
    AdlibRegister("_kanone",10)
    EndFunc
    Func _menukugeln()
    Global $hWndeinst = GUICreate("Einstellungen",$eWidth,$eHeight,0,-1)
    GUICtrlCreateLabel("Massen:",0,0,40,20)
    GUICtrlCreateLabel("Kugel1: m1 = ",0,$eHeight/8,70,20)
    Global $mk1 = GUICtrlCreateInput("1",$eWidth/3,$eHeight/8,40,20)
    GUICtrlCreateLabel("kg",$eWidth/1.8,$eHeight/8,15,20)
    GUICtrlCreateLabel("Kugel2 : m2 = ",0,$eHeight/4,70,20)
    Global $mk2 = GUICtrlCreateInput("1",$eWidth/3,$eHeight/4,40,20)
    GUICtrlCreateLabel("kg",$eWidth/1.8,$eHeight/4,15,20)
    GUICtrlCreateLabel("Geschwindigkeiten:",0,$eHeight/2.6,95,20)
    GUICtrlCreateLabel("Kugel1: v1 = ",0,$eHeight/2,70,20)
    Global $vk1 = GUICtrlCreateInput("1",$eWidth/3,$eHeight/2,40,20)
    GUICtrlCreateLabel("m/s",$eWidth/1.8,$eHeight/2,20,20)
    GUICtrlCreateLabel("Kugel2: v2 = ",0,$eHeight/1.6,70,20)
    Global $vk2 = GUICtrlCreateInput("-1",$eWidth/3,$eHeight/1.6,40,20)
    GUICtrlCreateLabel("m/s",$eWidth/1.8,$eHeight/1.6,20,20)
    GUISetState(@SW_SHOW)

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

    GUISetOnEvent(-3,"_sw_hide")

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

    AdlibRegister("_kugeln",10)
    EndFunc
    Func _kanone()
    _GDIPlus_GraphicsClear($hBuffer,0xFF777777)
    _GDIPlus_GraphicsDrawString($hBuffer,"Abschussgeschindigkeit: " & $strenght & "m/s",$iWidth/10,$iHeight/10)
    _GDIPlus_GraphicsDrawString($hBuffer,"Abschusswinkel: " & Round($alpha*180/-3.141) & "°",$iWidth/10,$iHeight/20)
    _GDIPlus_GraphicsDrawString($hBuffer,"Masse: " & $m & "kg",$iWidth*0.8,$iHeight/20)
    _GDIPlus_GraphicsDrawString($hBuffer,"Zeit: " & $t & "s",$iWidth/2, $iHeight/20)
    _GDIPlus_GraphicsDrawString($hBuffer,"(" & Round($kugelx) - $nullx & "/" & -1 * (Round($kugely) - $nully) & ")",$iWidth*0.8,$iHeight*0.15)
    _GDIPlus_GraphicsDrawLine($hBuffer,$nullx,$nully,Cos($alpha)*$krl+ $nullx,Sin($alpha)*$krl + $nully,$hPenrot)
    _GDIPlus_GraphicsDrawLine($hBuffer,0,$nully,$iWidth,$nully,$hPengruen)
    _GDIPlus_GraphicsDrawLine($hBuffer,$nullx,0,$nullx,$iHeight,$hPengruen)
    _GDIPlus_GraphicsDrawLine($hBuffer,$nullx + 100,$nully - 10,$nullx + 100,$nully +10, $hPengruen)
    _GDIPlus_GraphicsDrawEllipse($hBuffer,$kugelx - $kWidth/2,$kugely - $kHeight/2,$kWidth,$kWidth,$hPenrot)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$iWidth,$iHeight)

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

    If _IsPressed("01") Then $kzahl = 1
    If _IsPressed("02") Then
    $kzahl = 0
    $t = 0
    $kugelx = $nullx
    $kugely = $nully
    EndIf
    If _IsPressed("25") Then
    $alpha -= 0.1
    If $alpha <= -3.141/2 Then $alpha = -3.141/2
    EndIf

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

    If _IsPressed("27") Then
    $alpha += 0.1
    If $alpha >= 0 Then $alpha = 0
    EndIf

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

    If _IsPressed("26") Then
    $strenght += 1
    If $strenght >= 100 Then $strenght = 100
    EndIf

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

    If _IsPressed("28") Then
    $strenght -= 1
    If $strenght <= 1 Then $strenght = 1
    EndIf
    If $kzahl = 1 Then _flugbahn()

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

    If _IsPressed("11") And _IsPressed("01") Then
    $nullx = MouseGetPos(0)
    $nully = MouseGetPos(1)
    EndIf

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

    ToolTip($alpha & "," & 1000*Cos($alpha) & "," & Sin($alpha))
    EndFunc

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

    Func _flugbahn()
    $kugelx = 100 * Cos($alpha) * $strenght *$t + $nullx
    $kugely = 0.5 * $g * 100 * $t^2 + 100 * Sin($alpha) * $strenght * $t + $nully
    $t += 1/50
    EndFunc
    Func _kugeln()
    _GDIPlus_GraphicsClear($hBuffer,0xFF777777)

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

    _GDIPlus_GraphicsDrawString($hBuffer,"m1 = " & GUICtrlRead($mk1) & " kg",0,$iHeight/20)
    _GDIPlus_GraphicsDrawString($hBuffer,"m2 = " & GUICtrlRead($mk2) & " kg",$iWidth/4,$iHeight/20)
    _GDIPlus_GraphicsDrawString($hBuffer,"v1 = " & Round($kugel1step,2) & " m/s",0,$iHeight/10)
    _GDIPlus_GraphicsDrawString($hBuffer,"v2 = " & Round($kugel2step,2) & " m/s",$iWidth/4,$iHeight/10)
    _GDIPlus_GraphicsDrawString($hBuffer,"p1 = " & Round(GUICtrlRead($mk1) * $kugel1step,2) & " kg*m/s",0,$iHeight*(3/20))
    _GDIPlus_GraphicsDrawString($hBuffer,"p2 = " & Round(GUICtrlRead($mk2) * $kugel2step,2) & " kg*m/s",$iWidth/4,$iHeight*(3/20))

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

    If $startstop = 0 Then
    _GDIPlus_GraphicsDrawString($hBuffer,"Stop",$iWidth/1.25,$iHeight/20)
    ElseIf $startstop = 1 Then
    _GDIPlus_GraphicsDrawString($hBuffer,"Play",$iWidth/1.25,$iHeight/20)
    EndIf

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

    _GDIPlus_GraphicsDrawLine($hBuffer,0,$lHeight,$lWidth,$lHeight,$hPenrot)

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

    _GDIPlus_GraphicsFillEllipse($hBuffer,$kugel1x,$kugel1y,$k1Width,$k1Height,$hBrushrot)
    _GDIPlus_GraphicsDrawString($hBuffer,"1",$kugel1x + $k1Width/2,$kugel1y + $k1Height/2)
    _GDIPlus_GraphicsFillEllipse($hBuffer,$kugel2x,$kugel2y,$k2Width,$k2Height,$hBrushgruen)
    _GDIPlus_GraphicsDrawString($hBuffer,"2",$kugel2x + $k2Width/2,$kugel2y + $k2Height/2)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$iWidth,$iHeight)

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

    If _IsPressed("20") And $startstop = 0 Then
    $kugel1step = GUICtrlRead($vk1)
    $kugel2step = GUICtrlRead($vk2)
    $startstop = 1
    Sleep(250)
    EndIf

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

    If _IsPressed("20") And $startstop = 1 Then
    $kugel1step = 0
    $kugel2step = 0
    $startstop = 0
    Sleep(250)
    EndIf

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

    If _IsPressed("02") Then
    $kugel1x = 0
    $kugel2x = $iWidth - $k2Width
    $kugel1step = 0
    $kugel2step = 0
    EndIf

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

    If Sqrt((($kugel2x+$k2Width/2)-($kugel1x+$k1Width/2))^2 + (($kugel2y+$k2Height/2)-($kugel1y+$k1Height/2))^2) < $k1Width/2 + $k2Width/2 Then
    $kugel1step1 = $kugel1step
    $kugel2step1 = $kugel2step
    $kugel1step = (2*GUICtrlRead($mk2)*$kugel2step1+((GUICtrlRead($mk1)-GUICtrlRead($mk2))*$kugel1step1))/(GUICtrlRead($mk1)+GUICtrlRead($mk2))
    $kugel2step = (2*GUICtrlRead($mk1)*$kugel1step1+((GUICtrlRead($mk2)-GUICtrlRead($mk1))*$kugel2step1))/(GUICtrlRead($mk1)+GUICtrlRead($mk2))
    EndIf

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

    $kugel1x += $kugel1step
    $kugel2x += $kugel2step
    $kugel1y = $lHeight - $k1Height
    $kugel2y = $lHeight - $k2Height

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

    $k1Width = GUICtrlRead($mk1) * 10
    $k1Height = GUICtrlRead($mk1) * 10
    $k2Width = GUICtrlRead($mk2) * 10
    $k2Height = GUICtrlRead($mk2) * 10

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

    If _IsPressed("31") And _IsPressed("01") Then
    $kugel1x = MouseGetPos(0) - $k1Width/2
    EndIf

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

    If _IsPressed("32") And _IsPressed("01") Then
    $kugel2x = MouseGetPos(0) - $k2Width/2
    EndIf

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

    If $kugel1x < 0 Or $kugel1x + $k1Width > $iWidth Then $kugel1step *= -1
    If $kugel2x < 0 Or $kugel2x + $k2Width > $iWidth Then $kugel2step *= -1

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

    If GUICtrlRead($mk1) < 0.1 Then
    MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen 0.1 und 15 bestimmt werden.")
    GUICtrlSetData($mk1,"0.1")
    EndIf

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

    If GUICtrlRead($mk1) > 15 Then
    MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen 0.1 und 15 bestimmt werden.")
    GUICtrlSetData($mk1,"15")
    EndIf

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

    If GUICtrlRead($mk2) < 0.1 Then
    MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen 0.1 und 15 bestimmt werden.")
    GUICtrlSetData($mk2,"0.1")
    EndIf

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

    If GUICtrlRead($mk2) > 15 Then
    MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen 0.1 und 15 bestimmt werden.")
    GUICtrlSetData($mk2,"15")
    EndIf

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

    If GUICtrlRead($vk1) < -20 Then
    MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen -20 und 20 bestimmt werden.")
    GUICtrlSetData($vk1,"0.1")
    EndIf

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

    If GUICtrlRead($vk1) > 20 Then
    MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen -20 und 20 bestimmt werden.")
    GUICtrlSetData($vk1,"20")
    EndIf

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

    If GUICtrlRead($vk2) < -20 Then
    MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen -20 und 20 bestimmt werden.")
    GUICtrlSetData($vk2,"0.1")
    EndIf

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

    If GUICtrlRead($vk2) > 20 Then
    MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen -20 und 20 bestimmt werden.")
    GUICtrlSetData($vk2,"20")
    EndIf

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

    If _IsPressed("45") Then GUISetState(@SW_SHOW,$hWndeinst)
    EndFunc
    Func _hilfe()
    GUICreate("Hilfe",$iWidth,$iHeight,-1,-1)

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

    $tab1 = GUICtrlCreateTab(0,0,$iWidth,$iHeight)

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

    GUICtrlCreateTabItem("Kanone")
    GUICtrlCreateLabel("Um den Abschusswinkel zu bestimmen LINKS bzw. RECHTS verwenden." & @CRLF & @CRLF & "Um die Stärke des Abschusses also die Abschussgeschwindigkeit zu bestimmen HOCH und RUNTER verwenden." & @CRLF & @CRLF & "Zum starten die linke Maustaste drücken." & @CRLF & @CRLF & "Mit der rechten Maustaste wird alles wieder auf Anfang gesetzt." & @CRLF & @CRLF & "Damit man den Abschussort (Nullpunkt) verschieben kann muss man Strg und die linke Maustaste gedrückt halten.",5,50,$iWidth - 10,$iHeight/2)

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

    GUICtrlCreateTabItem("Kugeln")
    GUICtrlCreateLabel("Um die verschiedenen Verhaltenseigenschaften der Kugeln zu bestimmen, die jeweiligen Werte im linken kleinen Fenster eingeben." & @CRLF & @CRLF & "Um die einzelnen Kugeln vor dem Start zu bewegen jeweils 1 oder 2 und die linke Maustaste gedrückt halten." & @CRLF & @CRLF & "Zum starten der Simulation die Leertaste drücken. Um die Simulation zu unterbrechen wieder die Leertaste drücken." & @CRLF & @CRLF & "Um die Kugeln wieder auf Anfang zu setzen die rechte Maustaste drücken." & @CRLF & @CRLF & "Wenn man das Fenster mit den Einstellungen geschlossen hat, dann kann man es mit e wieder aufrufen.",5,50,$iWidth - 10,$iHeight/2)

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

    GUISetState(@SW_SHOW)

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

    GUISetOnEvent(-3,"_sw_hide")
    EndFunc
    Func _sw_hide()
    GUISetState(@SW_HIDE)
    EndFunc
    Func _exit()
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)

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

    _GDIPlus_PenDispose($hPenrot)
    _GDIPlus_PenDispose($hPengruen)

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

    _GDIPlus_BrushDispose($hBrushrot)
    _GDIPlus_BrushDispose($hBrushgruen)

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

    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    3 Mal editiert, zuletzt von mazZ (16. Juli 2010 um 17:58)

  • Ich schaffe es immernochnicht abzufeuern.

    Verbesserungsvorschlag:

    Den Tooltip wegmachen, wenn die Maus aus der GUI raus ist.

  • Ich hab das Script jetzt noch mal komplett erneuert und bei mir tuts auch. Ansonsten weiß ich auch nicht. Ist irgendwie der Wurm drin.

    mazZ

  • Mal ganz ehlich: Wozu brauchst du die Funktion _kanonemenue?

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • _menukanone() is nur da, wenn ich noch weitere Sachen, z.B. Billiard,usw. rein mache. Dann gibts des Menu am Anfang zum auswählen und im script mach ich dann mit den Func, is einfach.

    MfG mazZ

  • Hier hab ich noch ein Modul zu meiner Physik Engine zugefügt(s. Oben).

    Hoffe, dass dieses Mal keine Probleme auftreten.

    MfG mazZ