Hi,
das hier ist meine Physikengine.
Eine Hilfe mit genauer Anleitung ist enthalten.
Hoffe auf Kritik.
MfG mazZ
Spoiler anzeigen
#include <GDIPlus.au3>
#include <Misc.au3>
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
$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")
MsgBox(0,"Hinweis","Für die Hilfe h drücken.")
AdlibRegister("_menu",10)
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
_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
_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)
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)
_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
If _IsPressed("27") Then
$alpha += 0.1
If $alpha >= 0 Then $alpha = 0
EndIf
If _IsPressed("26") Then
$strenght += 1
If $strenght >= 100 Then $strenght = 100
EndIf
If _IsPressed("28") Then
$strenght -= 1
If $strenght <= 1 Then $strenght = 1
EndIf
If $kzahl = 1 Then _flugbahn()
If _IsPressed("11") And _IsPressed("01") Then
$nullx = MouseGetPos(0)
$nully = MouseGetPos(1)
EndIf
ToolTip($alpha & "," & 1000*Cos($alpha) & "," & Sin($alpha))
EndFunc
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)
_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))
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
_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)
_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
If _IsPressed("20") And $startstop = 1 Then
$kugel1step = 0
$kugel2step = 0
$startstop = 0
Sleep(250)
EndIf
If _IsPressed("02") Then
$kugel1x = 0
$kugel2x = $iWidth - $k2Width
$kugel1step = 0
$kugel2step = 0
EndIf
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
$kugel1x += $kugel1step
$kugel2x += $kugel2step
$kugel1y = $lHeight - $k1Height
$kugel2y = $lHeight - $k2Height
$k1Width = GUICtrlRead($mk1) * 10
$k1Height = GUICtrlRead($mk1) * 10
$k2Width = GUICtrlRead($mk2) * 10
$k2Height = GUICtrlRead($mk2) * 10
If _IsPressed("31") And _IsPressed("01") Then
$kugel1x = MouseGetPos(0) - $k1Width/2
EndIf
If _IsPressed("32") And _IsPressed("01") Then
$kugel2x = MouseGetPos(0) - $k2Width/2
EndIf
If $kugel1x < 0 Or $kugel1x + $k1Width > $iWidth Then $kugel1step *= -1
If $kugel2x < 0 Or $kugel2x + $k2Width > $iWidth Then $kugel2step *= -1
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
If GUICtrlRead($mk1) > 15 Then
MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen 0.1 und 15 bestimmt werden.")
GUICtrlSetData($mk1,"15")
EndIf
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
If GUICtrlRead($mk2) > 15 Then
MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen 0.1 und 15 bestimmt werden.")
GUICtrlSetData($mk2,"15")
EndIf
If GUICtrlRead($vk1) < -20 Then
MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen -20 und 20 bestimmt werden.")
GUICtrlSetData($vk1,"0.1")
EndIf
If GUICtrlRead($vk1) > 20 Then
MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen -20 und 20 bestimmt werden.")
GUICtrlSetData($vk1,"20")
EndIf
If GUICtrlRead($vk2) < -20 Then
MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen -20 und 20 bestimmt werden.")
GUICtrlSetData($vk2,"0.1")
EndIf
If GUICtrlRead($vk2) > 20 Then
MsgBox(0,"Wertüberschreitung","Das Gewicht kann nur zwischen -20 und 20 bestimmt werden.")
GUICtrlSetData($vk2,"20")
EndIf
If _IsPressed("45") Then GUISetState(@SW_SHOW,$hWndeinst)
EndFunc
Func _hilfe()
GUICreate("Hilfe",$iWidth,$iHeight,-1,-1)
$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)
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)
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)
_GDIPlus_PenDispose($hPenrot)
_GDIPlus_PenDispose($hPengruen)
_GDIPlus_BrushDispose($hBrushrot)
_GDIPlus_BrushDispose($hBrushgruen)
_GDIPlus_Shutdown()
Exit
EndFunc