#include <GUIConstants.au3>
#include <GDIPlus.au3>
#include <Misc.au3>

Global $GUIWidth = 400 ;Breite des Fensters
Global $GUIHeight = 400 ;Höhe des Fensters
Global $Size = 3 ;Durchmesser des Kreises der die einzelnen Bögen vervollständigt
Global $PenSize = 1 ;Randstärke der Linie
Global $Angle = Random(0, 3, 1) * 90 ;Startwinkel (Gültige Werte: 0°, 90°, 180°, 270°)
Global $iX = Random($Size, $GUIWidth / $Size - $Size, 1) * $Size ;X-Startkoordinate
Global $iY = Random($Size, $GUIHeight / $Size - $Size, 1) * $Size ;Y-Startkoordinate
Global $GUIColorBG = 0xFFFFFFFF ;Hintergrundfarbe der GUI
Global $LineColor = 0xFF000000 ;Farbe der geschlängelten Linie

Global $LEFT = False
Global $UP = False
Global $RIGHT = False
Global $DOWN = False

If $Angle = 0 Then
	$RIGHT = True
	Global $VectorX = $Size
	Global $VectorY = 0
ElseIf $Angle = 90 Then
	$DOWN = True
	Global $VectorX = 0
	Global $VectorY = $Size
ElseIf $Angle = 180 Then
	$LEFT = True
	Global $VectorX = $Size * - 1
	Global $VectorY = 0
ElseIf $Angle = 270 Then
	$UP = True
	Global $VectorX = 0
	Global $VectorY = $Size * - 1
EndIf

Global $Switch180 = 180

$hGUI = GUICreate("Schlangenlinien", $GUIWidth, $GUIHeight)
GUISetState()

_GDIPlus_Startup()

Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GUIWidth, $GUIHeight, $hGraphics)
Global $Buffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($Buffer, 2)
_GDIPlus_GraphicsClear($Buffer, $GUIColorBG)

Global $hPen = _GDIPlus_PenCreate($LineColor, $PenSize)

AdlibRegister("_DrawArc", 20)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_GDIPlus_GraphicsDispose($hGraphics)
			_GDIPlus_GraphicsDispose($Buffer)
			_GDIPlus_ImageDispose($hBitmap)
			_GDIPlus_PenDispose($hPen)
			_GDIPlus_Shutdown()
			Exit
	EndSwitch
	If _IsPressed("25") Then
		If $LEFT = False Then
			$LEFT = True
			$UP = False
			$RIGHT = False
			$DOWN = False
			$Angle = 180
			$VectorX = $Size * - 1
			$VectorY = 0
			_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
			Sleep(100)
		EndIf
	EndIf
	If _IsPressed("26") Then
		If $UP = False Then
			$LEFT = False
			$UP = True
			$RIGHT = False
			$DOWN = False
			$Angle = 270
			$VectorX = 0
			$VectorY = $Size * - 1
			_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
			Sleep(100)
		EndIf
	EndIf
	If _IsPressed("27") Then
		If $RIGHT = False Then
			$LEFT = False
			$UP = False
			$RIGHT = True
			$DOWN = False
			$Angle = 0
			$VectorX = $Size
			$VectorY = 0
			_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
			Sleep(100)
		EndIf
	EndIf
	If _IsPressed("28") Then
		If $DOWN = False Then
			$LEFT = False
			$UP = False
			$RIGHT = False
			$DOWN = True
			$Angle = 90
			$VectorX = 0
			$VectorY = $Size
			_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
			Sleep(100)
		EndIf
	EndIf
WEnd

Func _DrawArc()
	#Region CollisionCheck
	If $iX >= $GUIWidth - $Size * 2 And $Angle = 0 And $iY < $GUIHeight / 2 Then
		$LEFT = False
		$UP = False
		$RIGHT = False
		$DOWN = True
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = 0
		$VectorY = $Size
		$Angle = 90
	EndIf
	If $iX >= $GUIWidth - $Size * 2 And $Angle = 0 And $iY >= $GUIHeight / 2 Then
		$LEFT = False
		$UP = True
		$RIGHT = False
		$DOWN = False
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = 0
		$VectorY = $Size * - 1
		$Angle = 270
	EndIf
	If $iX <= 0 And $Angle = 180 And $iY < $GUIHeight / 2 Then
		$LEFT = False
		$UP = False
		$RIGHT = False
		$DOWN = True
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = 0
		$VectorY = $Size
		$Angle = 90
	EndIf
	If $iX <= 0 And $Angle = 180 And $iY >= $GUIHeight / 2 Then
		$LEFT = False
		$UP = True
		$RIGHT = False
		$DOWN = False
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = 0
		$VectorY = $Size * - 1
		$Angle = 270
	EndIf
	If $iY >= $GUIHeight - $Size * 2 And $Angle = 90 And $iX < $GUIWidth / 2 Then
		$LEFT = False
		$UP = False
		$RIGHT = True
		$DOWN = False
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = $Size
		$VectorY = 0
		$Angle = 0
	EndIf
	If $iY >= $GUIHeight - $Size * 2 And $Angle = 90 And $iX >= $GUIWidth / 2 Then
		$LEFT = True
		$UP = False
		$RIGHT = False
		$DOWN = False
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = $Size * - 1
		$VectorY = 0
		$Angle = 180
	EndIf
	If $iY <= 0 And $Angle = 270 And $iX < $GUIHeight / 2 Then
		$LEFT = False
		$UP = False
		$RIGHT = True
		$DOWN = False
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = $Size
		$VectorY = 0
		$Angle = 0
	EndIf
	If $iY <= 0 And $Angle = 270 And $iX >= $GUIHeight / 2 Then
		$LEFT = True
		$UP = False
		$RIGHT = False
		$DOWN = False
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = $Size * - 1
		$VectorY = 0
		$Angle = 180
	EndIf
	#EndRegion CollisionCheck
	$iX += $VectorX
	$iY += $VectorY
	$Switch180 *= -1
	_GDIPlus_GraphicsDrawArc($Buffer, $iX, $iY, $Size, $Size, $Angle, $Switch180, $hPen)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $GUIWidth, $GUIHeight)
EndFunc   ;==>_DrawArc
