GDI+ Spiel: "Targets"

  • In diesem Spiel geht es darum, mit der Maus die herunterfallenden Zielscheiben möglichst weit in der Mitte "abzuschießen" bevor das Zeitlimit erreicht ist (kleinere Zielscheiben bringen mehr Punkte). Escape bringt euch zurück ins Hauptmenü.
    Es ist zwar noch nicht ganz fertig, aber hat immerhin schon:
    - Ein Menü
    - Eine Funktion die überprüft, ob ein Punkt innerhalb eines Kreises liegt ohne dabei imaginäre Rechtecke zu verwenden.
    - Eine Score Funktion.
    - Ein einigermaßen akzeptables Physics Engine (wenn auch ohne Kreiskollisionen).
    - Ein sich bewegendes Hintergrundbild.
    - Soundeffekte :rofl:
    - Brushs mit linearem Farbverlauf
    - Einige Funktionen die zwar im Script nicht benutzt werden, aber dennoch sehr nützlich sein können.


    Ich würde mich über Tipps für das Game Balancing und sonstige produktive Krtitik freuen :) .

    Edit: Dank eines kleinen Rechtschreibfehlers war die komplette Score Funktion außer Kraft gesetzt :rolleyes: Ist jetzt aber verbessert. Außerdem werden die Scores jetzt sortiert.
    Version 1.1 mit kleinen Extras, wie einer nützlichen Beep Funktion die einem die letzten Sekunden des Spiels einläutet, ist up. 8)
    Version 1.2 mit einem völlig neuen Menü Design ist da. (Die benötigte Schriftart im zip Archiv muss vorher installiert werden)
    Version 1.3 mit leichten Veränderungen und die Schriftart wird jetzt mit MemFont "includet" und muss nicht mehr installiert werden. ^^

    Version 1.0 (zip mit Script + benötigten Dateien im Anhang)

    Spoiler anzeigen
    [autoit]

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

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

    If FileExists("Scores.ini") = 0 Then
    $hFile = FileOpen("Scores.ini", 1)
    FileWrite($hFile, "[ScoreTable]" & @CRLF)
    FileClose($hFile)
    EndIf

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

    $iGUIWidth = 400
    $iGUIHeight = 700

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

    $iScore = 0
    $sScores = ""
    $sUser = ""

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

    $Found = False
    $iTimelimit = 20000
    $iTime = $iTimelimit
    Global $Timer = 0

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

    $iX_Cloud1 = Random(-100, $iGUIWidth + 100, 1)
    $iX_Cloud2 = Random(-100, $iGUIWidth + 100, 1)
    $vX_Cloud1 = Round(Random(-0.5, 0.5), 2)
    $vX_Cloud2 = Round(Random(-0.5, 0.5), 2)
    $iY_Cloud1 = $iGUIHeight / 3
    $iY_Cloud2 = $iGUIHeight / 3 * 2

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

    Global $iX_Explosion = 0, $iY_Explosion = 0, $bExplosion = False
    Global $iX_IncDec = 0, $iY_IncDec = 0, $sIncDec = 0, $iTimerIncDec = 0

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

    Global $iHours, $iMins, $iSecs

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

    $Gravitation = 0.1
    $Reibung = 0.98
    $Reibung2 = 0.95

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

    $hGunSound = _SoundOpen(@ScriptDir & "\Gun.wav")
    $hBGMusic = _SoundOpen(@ScriptDir & "\BGMusic.mp3")

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

    $hWndUserName = GUICreate("Namen eingeben", 200, 55, -1, -1, $WS_CAPTION)
    $UserInput = GUICtrlCreateInput("Name", 0, 0, 200, 25, 0x0001)
    GUICtrlSetLimit(-1, 6)
    GUICtrlSetFont(-1, 12)
    $OKButton = GUICtrlCreateButton("OK", 0, 25, 200, 15)
    $ExitButton = GUICtrlCreateButton("Beenden", 0, 40, 200, 15)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $ExitButton
    Exit
    Case $OKButton, $UserInput
    $sUser = GUICtrlRead($UserInput)
    If StringReplace($sUser, " ", "") <> "" Then
    GUIDelete($hWndUserName)
    ExitLoop
    EndIf
    EndSwitch
    WEnd

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

    $hWnd = GUICreate("Targets", $iGUIWidth, $iGUIHeight, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
    GUISetCursor(3, 1)
    GUISetState()

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

    _GDIPlus_Startup()

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

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

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

    $Cloud1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Wolke1.png")
    $Cloud2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Wolke2.png")
    $hExplosion = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Explosion.png")

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

    $hBrushWhite = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $hBrushRed = _GDIPlus_BrushCreateSolid(0xFFFF0000)
    $hBrushGreen = _GDIPlus_BrushCreateSolid(0xFF00FF00)
    $hBrushBlue = _GDIPlus_BrushCreateSolid(0xFF0000FF)
    $hBrushYellow = _GDIPlus_BrushCreateSolid(0xFFFFFF00)
    $hBrushBlack = _GDIPlus_BrushCreateSolid(0xFF000000)
    $hBrushScore = _GDIPlus_BrushCreateLinear($iGUIWidth - 15, $iGUIHeight - 50, $iGUIWidth - 105, $iGUIHeight, 0xFFFF0000, 0xFF000000)
    $hBrushTime = _GDIPlus_BrushCreateLinear(0, $iGUIHeight - 50, 105, $iGUIHeight, 0xFFFF0000, 0xFF000000)
    $hBrushBG = _GDIPlus_BrushCreateLinear(0, 0, 0, $iGUIHeight, 0xFF7BCFF, 0xFF0057B5)
    $hBrushButtonGreen2 = _GDIPlus_BrushCreateLinear($iGUIWidth / 2 - 110, $iGUIHeight / 2 + 50, $iGUIWidth / 2 - 10, $iGUIHeight / 2 + 200, 0xFF86F586, 0xFF0F3704)
    $hBrushButtonRed = _GDIPlus_BrushCreateLinear($iGUIWidth / 2 + 10, $iGUIHeight / 2 + 50, $iGUIWidth / 2 + 110, $iGUIHeight / 2 + 200, 0xFFFFA4A8, 0xFF800000)
    $hBrushScoreTable = _GDIPlus_BrushCreateLinear(0, 0, 0, $iGUIHeight / 2 + 50, 0xFF00FF00, 0xFFFF0000)

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

    $hPenBlack1 = _GDIPlus_PenCreate(0xFF000000, 6)
    $hPenBlack2 = _GDIPlus_PenCreate(0xFF000000, 6)

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

    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate("Tahoma")
    $hFont = _GDIPlus_FontCreate($hFamily, 25, 1)
    $hFont2 = _GDIPlus_FontCreate($hFamily, 18, 1)
    $tLayoutScore = _GDIPlus_RectFCreate($iGUIWidth - 120, $iGUIHeight - 50, 0, 0)
    $tLayoutTime = _GDIPlus_RectFCreate(5, $iGUIHeight - 50, 0, 0)
    $tLayoutStart = _GDIPlus_RectFCreate($iGUIWidth / 2 - 102, $iGUIHeight / 2 + 85, 0, 0)
    $tLayoutExit = _GDIPlus_RectFCreate($iGUIWidth / 2 + 26, $iGUIHeight / 2 + 85, 0, 0)
    $tLayoutScoreTable = _GDIPlus_RectFCreate(20, 5, 0, $iGUIHeight / 2 - 20)

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

    Dim $aCircles[3][6]
    For $i = 0 To UBound($aCircles) - 1
    $aCircles[$i][0] = Random(70, 340, 1)
    $aCircles[$i][1] = -100
    $aCircles[$i][2] = Random(30, 60, 1)
    $aCircles[$i][3] = Random(-20, 20, 1)
    $aCircles[$i][4] = Random(-10, 0, 1)
    $aCircles[$i][5] = Round($aCircles[$i][2] / 5)
    Next

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    HotKeySet("{ESC}", "_Menu")

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

    _Menu()

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

    Func _MainLoop()
    _SoundPlay($hBGMusic)
    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    _Exit()
    Case $GUI_EVENT_PRIMARYDOWN
    _SoundStop($hGunSound)
    _SoundPlay($hGunSound)
    $iX_IncDec = $nMsg[3] + 20
    $iY_IncDec = $nMsg[4] - 10
    For $i = 0 To UBound($aCircles) - 1
    $iDistFromMiddle = _PointIsInCircle($nMsg[3], $nMsg[4], $aCircles[$i][0] + $aCircles[$i][2] / 2, $aCircles[$i][1] + $aCircles[$i][2] / 2, $aCircles[$i][2] / 2)
    If $iDistFromMiddle <> -1 Then
    $bExplosion = True
    $iX_Explosion = $nMsg[3] - 10
    $iY_Explosion = $nMsg[4] - 10
    $Found = True
    $iTimerIncDec = TimerInit()
    Switch Round($iDistFromMiddle)
    Case 0 To $aCircles[$i][5] / 2
    Switch $aCircles[$i][2]
    Case 30 To 40
    $iScore += 20
    $sIncDec = 20
    Case 41 To 50
    $iScore += 15
    $sIncDec = 15
    Case 51 To 60
    $iScore += 10
    $sIncDec = 10
    Case 300
    $iScore += 100
    $sIncDec = 100
    EndSwitch
    Case $aCircles[$i][5] / 2 + 1 To $aCircles[$i][5] * 2 / 2
    Switch $aCircles[$i][2]
    Case 30 To 40
    $iScore += 16
    $sIncDec = 16
    Case 41 To 50
    $iScore += 12
    $sIncDec = 12
    Case 51 To 60
    $iScore += 8
    $sIncDec = 8
    Case 300
    $iScore += 80
    $sIncDec = 80
    EndSwitch
    Case $aCircles[$i][5] * 2 / 2 + 1 To $aCircles[$i][5] * 3 / 2
    Switch $aCircles[$i][2]
    Case 30 To 40
    $iScore += 8
    $sIncDec = 8
    Case 41 To 50
    $iScore += 6
    $sIncDec = 6
    Case 51 To 60
    $iScore += 4
    $sIncDec = 4
    Case 300
    $iScore += 70
    $sIncDec = 70
    EndSwitch
    Case $aCircles[$i][5] * 3 / 2 + 1 To $aCircles[$i][5] * 4 / 2
    Switch $aCircles[$i][2]
    Case 30 To 40
    $iScore += 4
    $sIncDec = 4
    Case 41 To 50
    $iScore += 3
    $sIncDec = 3
    Case 51 To 60
    $iScore += 2
    $sIncDec = 2
    Case 300
    $iScore += 60
    $sIncDec = 60
    EndSwitch
    Case $aCircles[$i][5] * 4 / 2 + 1 To $aCircles[$i][5] * 5 / 2 + 2
    Switch $aCircles[$i][2]
    Case 30 To 40
    $iScore += 3
    $sIncDec = 3
    Case 41 To 50
    $iScore += 2
    $sIncDec = 2
    Case 51 To 60
    $iScore += 1
    $sIncDec = 1
    Case 300
    $iScore += 50
    $sIncDec = 50
    EndSwitch
    EndSwitch
    $aCircles[$i][0] = 10
    $aCircles[$i][1] = $iGUIHeight + 200
    ExitLoop
    EndIf
    Next
    If $Found = False And $iScore > 0 Then
    $iScore -= 1
    $sIncDec = -1
    EndIf
    $Found = False
    EndSwitch
    $iTime = Round(TimerDiff($Timer))
    If $iTime >= $iTimelimit Then
    _Menu()
    EndIf
    If _SoundStatus($hBGMusic) = "stopped" Then
    _SoundPlay($hBGMusic)
    EndIf
    WEnd
    EndFunc ;==>_MainLoop

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

    Func _Menu()
    AdlibUnRegister()
    $Gravitation = 0.2
    If $iScore <> 0 Then
    While StringInStr($iScore, "0") = 1
    $iScore = StringTrimLeft($iScore, 1)
    WEnd
    FileWrite("Scores.ini", @CRLF & $sUser & "=" & $iScore)
    EndIf
    $aScores_Ini = IniReadSection("Scores.ini", "ScoreTable")
    _ArraySortNum($aScores_Ini)
    If Not @error Then
    $sScores = "Players | Scores" & @CRLF
    For $i = 1 To $aScores_Ini[0][0]
    $sScores &= @CRLF & $aScores_Ini[$i][0] & ": " & $aScores_Ini[$i][1]
    Next
    EndIf
    $iScore = 0
    For $i = 0 To UBound($aCircles) - 1
    $aCircles[$i][1] = $iGUIHeight + 200
    Next
    _ReDrawMenu()
    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    _Exit()
    Case $GUI_EVENT_RESTORE
    WM_PAINT()
    Case $GUI_EVENT_PRIMARYDOWN
    If _PointIsInCircle($nMsg[3], $nMsg[4], $iGUIWidth / 2 - 60, $iGUIHeight / 2 + 100, 50) <> -1 Then
    While _IsPressed("01")
    If _GDIPlus_PenGetWidth($hPenBlack1) <> 12 Then
    _GDIPlus_PenSetWidth($hPenBlack1, 12)
    _ReDrawMenu()
    EndIf
    Sleep(30)
    WEnd
    _GDIPlus_PenSetWidth($hPenBlack1, 6)
    _ReDrawMenu()
    Sleep(50)
    $Timer = TimerInit()
    AdlibRegister("_ReDraw", 30)
    _MainLoop()
    EndIf
    If _PointIsInCircle($nMsg[3], $nMsg[4], $iGUIWidth / 2 + 60, $iGUIHeight / 2 + 100, 50) <> -1 Then
    While _IsPressed("01")
    If _GDIPlus_PenGetWidth($hPenBlack2) <> 12 Then
    _GDIPlus_PenSetWidth($hPenBlack2, 12)
    _ReDrawMenu()
    EndIf
    Sleep(30)
    WEnd
    _GDIPlus_PenSetWidth($hPenBlack2, 6)
    _ReDrawMenu()
    Sleep(50)
    _Exit()
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>_Menu

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

    Func _Swap(ByRef $sItem1, ByRef $sItem2)
    $sTemp = $sItem1
    $sItem1 = $sItem2
    $sItem2 = $sTemp
    EndFunc ;==>_Swap

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

    Func _ReDrawMenu()
    _GDIPlus_GraphicsClear($hBuffer)
    _GDIPlus_GraphicsFillRect($hBuffer, 0, 0, $iGUIWidth, $iGUIHeight, $hBrushBG)
    _GDIPlus_GraphicsDrawEllipse($hBuffer, $iGUIWidth / 2 - 110, $iGUIHeight / 2 + 50, 100, 100, $hPenBlack1)
    _GDIPlus_GraphicsDrawEllipse($hBuffer, $iGUIWidth / 2 + 10, $iGUIHeight / 2 + 50, 100, 100, $hPenBlack2)
    _GDIPlus_GraphicsFillEllipse($hBuffer, $iGUIWidth / 2 - 110, $iGUIHeight / 2 + 50, 100, 100, $hBrushButtonGreen2)
    _GDIPlus_GraphicsFillEllipse($hBuffer, $iGUIWidth / 2 + 10, $iGUIHeight / 2 + 50, 100, 100, $hBrushButtonRed)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, $sScores, $hFont2, $tLayoutScoreTable, $hFormat, $hBrushScoreTable)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, "START", $hFont2, $tLayoutStart, $hFormat, $hBrushBlack)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, "EXIT", $hFont2, $tLayoutExit, $hFormat, $hBrushBlack)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc ;==>_ReDrawMenu

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

    Func _ReDraw()
    $Gravitation += 0.0001
    $iX_Cloud1 += $vX_Cloud1
    $iX_Cloud2 += $vX_Cloud2
    If $vX_Cloud1 > 0 And $iX_Cloud1 >= $iGUIWidth Then $iX_Cloud1 = -100
    If $vX_Cloud1 < 0 And $iX_Cloud1 <= -100 Then $iX_Cloud1 = $iGUIWidth
    If $vX_Cloud2 > 0 And $iX_Cloud2 >= $iGUIWidth Then $iX_Cloud2 = -100
    If $vX_Cloud2 < 0 And $iX_Cloud2 <= -100 Then $iX_Cloud2 = $iGUIWidth
    _GDIPlus_GraphicsClear($hBuffer)
    _GDIPlus_GraphicsFillRect($hBuffer, 0, 0, $iGUIWidth, $iGUIHeight, $hBrushBG)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $Cloud1, $iX_Cloud1, $iY_Cloud1, 100, 50)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $Cloud2, $iX_Cloud2, $iY_Cloud2, 100, 50)
    For $i = 0 To UBound($aCircles) - 1
    If $aCircles[$i][3] > 0 And $aCircles[$i][0] + $aCircles[$i][2] >= $iGUIWidth Then
    $aCircles[$i][3] *= -$Reibung2
    $aCircles[$i][4] *= $Reibung2
    EndIf
    If $aCircles[$i][4] > 0 And $aCircles[$i][1] - $aCircles[$i][2] >= $iGUIHeight Then
    $aCircles[$i][0] = Random(70, 340, 1)
    $aCircles[$i][1] = -100
    $aCircles[$i][2] = Random(30, 60, 1)
    $aCircles[$i][3] = Random(-20, 20, 1)
    $aCircles[$i][4] = Random(-10, 0, 1)
    $aCircles[$i][5] = Round($aCircles[$i][2] / 5)
    EndIf
    If $aCircles[$i][3] < 0 And $aCircles[$i][0] <= 0 Then
    $aCircles[$i][3] *= -$Reibung2
    $aCircles[$i][4] *= $Reibung2
    EndIf
    $aCircles[$i][0] += $aCircles[$i][3]
    $aCircles[$i][1] += $aCircles[$i][4]
    $aCircles[$i][4] += $Gravitation
    $aCircles[$i][3] *= $Reibung
    $aCircles[$i][4] *= $Reibung
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aCircles[$i][0], $aCircles[$i][1], $aCircles[$i][2], $aCircles[$i][2], $hBrushWhite)
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aCircles[$i][0] + $aCircles[$i][5] / 2, $aCircles[$i][1] + $aCircles[$i][5] / 2, $aCircles[$i][2] - $aCircles[$i][5], $aCircles[$i][2] - $aCircles[$i][5], $hBrushBlack)
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aCircles[$i][0] + $aCircles[$i][5] * 2 / 2, $aCircles[$i][1] + $aCircles[$i][5] * 2 / 2, $aCircles[$i][2] - $aCircles[$i][5] * 2, $aCircles[$i][2] - $aCircles[$i][5] * 2, $hBrushBlue)
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aCircles[$i][0] + $aCircles[$i][5] * 3 / 2, $aCircles[$i][1] + $aCircles[$i][5] * 3 / 2, $aCircles[$i][2] - $aCircles[$i][5] * 3, $aCircles[$i][2] - $aCircles[$i][5] * 3, $hBrushRed)
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aCircles[$i][0] + $aCircles[$i][5] * 4 / 2, $aCircles[$i][1] + $aCircles[$i][5] * 4 / 2, $aCircles[$i][2] - $aCircles[$i][5] * 4, $aCircles[$i][2] - $aCircles[$i][5] * 4, $hBrushYellow)
    Next
    If $bExplosion = True Then
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hExplosion, $iX_Explosion, $iY_Explosion, 25, 25)
    $bExplosion = False
    EndIf
    For $i = 1 To 5 - StringLen($iScore)
    $iScore = "0" & $iScore
    Next
    _TicksToTime($iTimelimit - $iTime, $iHours, $iMins, $iSecs)
    If StringLen($iMins) = 1 Then $iMins = "0" & $iMins
    If StringLen($iSecs) = 1 Then $iSecs = "0" & $iSecs
    _GDIPlus_GraphicsDrawStringEx($hBuffer, $iMins & ":" & $iSecs, $hFont, $tLayoutTime, $hFormat, $hBrushTime)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, $iScore, $hFont, $tLayoutScore, $hFormat, $hBrushScore)
    $tLayoutIncDec = _GDIPlus_RectFCreate($iX_IncDec, $iY_IncDec, 0, 0)
    If $sIncDec > 0 Then _GDIPlus_GraphicsDrawStringEx($hBuffer, $sIncDec, $hFont, $tLayoutIncDec, $hFormat, $hBrushGreen)
    If $sIncDec < 0 Then _GDIPlus_GraphicsDrawStringEx($hBuffer, $sIncDec, $hFont, $tLayoutIncDec, $hFormat, $hBrushRed)
    If TimerDiff($iTimerIncDec) >= 1000 Then $sIncDec = 0
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc ;==>_ReDraw

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

    Func _Exit()
    AdlibUnRegister()
    _SoundClose($hGunSound)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($Cloud1)
    _GDIPlus_ImageDispose($Cloud2)
    _GDIPlus_ImageDispose($hExplosion)
    _GDIPlus_BrushDispose($hBrushBlack)
    _GDIPlus_BrushDispose($hBrushWhite)
    _GDIPlus_BrushDispose($hBrushRed)
    _GDIPlus_BrushDispose($hBrushGreen)
    _GDIPlus_BrushDispose($hBrushYellow)
    _GDIPlus_BrushDispose($hBrushBlue)
    _GDIPlus_BrushDispose($hBrushScore)
    _GDIPlus_BrushDispose($hBrushTime)
    _GDIPlus_BrushDispose($hBrushScoreTable)
    _GDIPlus_BrushDispose($hBrushButtonGreen2)
    _GDIPlus_BrushDispose($hBrushButtonRed)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontDispose($hFont2)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

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

    Func _ArraySortNum(ByRef $array); Von Oscar https://autoit.de/index.php?page…5912#post105912, Bearbeitet von ????
    Local $tmp,$tmp2
    For $i = 1 To UBound($array) - 2
    For $j = $i + 1 To UBound($array) - 1
    If Number($array[$j][1]) > Number($array[$i][1]) Then
    $tmp = $array[$i][0]
    $tmp2 = $array[$i][1]
    $array[$i][0] = $array[$j][0]
    $array[$i][1] = $array[$j][1]
    $array[$j][0] = $tmp
    $array[$j][1] = $tmp2
    EndIf
    Next
    Next
    EndFunc

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

    Func _GDIPlus_BrushCreateLinear($iX1, $iY1, $iX2, $iY2, $iARGB1 = 0xFF000000, $iARGB2 = 0xFFFFFFFF)
    Local $aResult, $Start, $End, $pStart, $pEnd
    $Start = DllStructCreate("int X;int Y")
    DllStructSetData($Start, "X", $iX1)
    DllStructSetData($Start, "Y", $iY1)
    $pStart = DllStructGetPtr($Start)
    $End = DllStructCreate("int X;int Y")
    DllStructSetData($End, "X", $iX2)
    DllStructSetData($End, "Y", $iY2)
    $pEnd = DllStructGetPtr($End)
    $aResult = DllCall($ghGDIPDll, "int", "GdipCreateLineBrushI", "ptr", $pStart, "ptr", $pEnd, "int", $iARGB1, "int", $iARGB2, "int", 0, "int*", 0)
    If @error Then Return 0
    Return SetError(0, $aResult[0], $aResult[6])
    EndFunc ;==>_GDIPlus_BrushCreateLinear

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

    Func _PointIsInCircle($iX_Point, $iY_Point, $iX_Circle, $iY_Circle, $iRadius_Circle)
    $iDistPoints = _GetPointsDistance($iX_Point, $iY_Point, $iX_Circle, $iY_Circle)
    If ($iRadius_Circle > 0 And $iDistPoints < $iRadius_Circle) Or ($iRadius_Circle < 0 And $iDistPoints > $iRadius_Circle) Or $iDistPoints = 0 Then Return $iDistPoints
    Return -1
    EndFunc ;==>_PointIsInCircle

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

    Func _CircleIsTouchingCircle($iX_Circle1, $iY_Circle1, $iX_Circle2, $iY_Circle2, $iRadius_Circle1, $iRadius_Circle2)
    $iDistCircles = _GetPointsDistance($iX_Circle1, $iY_Circle1, $iX_Circle2, $iY_Circle2)
    If $iDistCircles < $iRadius_Circle1 + $iRadius_Circle2 Then Return True
    Return False
    EndFunc ;==>_CircleIsTouchingCircle

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

    Func _CircleIsInCircle($iX_Circle1, $iY_Circle1, $iX_Circle2, $iY_Circle2, $iRadius_Circle1, $iRadius_Circle2)
    $iDistCircles = _GetPointsDistance($iX_Circle1, $iY_Circle1, $iX_Circle2, $iY_Circle2)
    If $iRadius_Circle1 > $iRadius_Circle2 And $iDistCircles <= $iRadius_Circle1 - $iRadius_Circle2 Then Return True
    If $iRadius_Circle1 < $iRadius_Circle2 And $iDistCircles <= $iRadius_Circle2 - $iRadius_Circle1 Then Return True
    Return False
    EndFunc ;==>_CircleIsInCircle

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

    Func _GetPointsDistance($iPointX1, $iPointY1, $iPointX2, $iPointY2)
    Return Sqrt(($iPointX1 - $iPointX2) ^ 2 + ($iPointY1 - $iPointY2) ^ 2)
    EndFunc ;==>_GetPointsDistance

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

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

    [/autoit]
  • So, hab mich nun auch mal angemeldet =)

    erstmal ganz nettes Game ;)
    Jedoch hab ich komischerweise das Problem, wenn ich es im "Vordergrund" habe, nichts passiert, zwar die Zielscheiben runterfallen, aber weder die Zeit läuft noch ein Ton kommt etc...
    Aber wenn ich den Task-Manager z.b. in Vordergrund schieb, alles ganz normal läuft ....

    Kann das am Skript liegen ? =)

    Falls ich was finde sag ich bescheid .....

    Vg

  • Schönes Script - sauber programmiert, nur wenn ich schieße, dann stockt kurz das Skript und vom Drücken der LMT bis zum Schuss vergeht zu viel Zeit!

    Getestet auf Vista x32 und AutoIt v3.3.6.0.

    Kannst ja mal Moorhuhn coden ;)

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich habe die maximale Zeichenlänge für den Spielernamen auf 6 gesetzt, das werde ich auch noch ändern. Das ist leider ein bisschen aufwendig, weil dann alle Koordinaten angepasst werden müssen. :S
    Eine Online Highscore Funktion wäre cool, einen Server hab ich zumindest schon. Leider weiß ich nicht wie ich Daten an ihn Senden kann ohne, dass jeder meine Server Passwörter etc. herauskriegt. Schließlich will ich ja weiterhin alles in Scriptform und nicht als exe bereitstellen (von den Decompilern will ich gar nicht erst anfangen :rolleyes: ).

  • Zitat

    Leider weiß ich nicht wie ich Daten an ihn Senden kann ohne, dass jeder meine Server Passwörter etc. herauskriegt.


    Diese Frage plagt mich auch schon seit ner weile :S

    ansonst nettes game nur ich muss immer kurz vor der scheibe klicken sonst verfehl ich

  • Zitat

    ansonst nettes game nur ich muss immer kurz vor der scheibe klicken sonst verfehl ich


    Das liegt vielleicht daran, dass GDI+ langsamer zeichnet als das Script die Koordinaten neu berechnet :S
    Naja solange du überhaupt triffst :P
    Ach ja hat vielleicht jemand eine Idee welche Musik ich als Hintergrundmusik verwenden könnte? Ich hab schon viel Lizenzfreies gefunden, aber noch nichts was zu meinem Spiel passt. :(

    Version 1.1 mit kleinen Verbesserungen siehe 1.Post

  • "????" hat mich schon auf die Idee mit der Hintergrundmusik gebracht. Scheinbar hängt es dann nicht ganz so sehr... Problem: Ich habe keine passende Musik gefunden. :D
    Wer möchte kann auch eine Datei mit dem Namen "BGMusic.wav" ins Scriptverzeichnis packen. ^^
    Bei mir hängt es übrigens kein bisschen, und ich hab Vista. ?(

  • Muss ich wegen dir jetzt etwa noch verschiedenfarbige Zielscheiben verwenden? :rofl:
    Nachher kommt ihr noch mit CheatEngine... ^^

    Zitat

    Aber: bei mir in der version 1.2 (zip version) wird beim spielstart kein test wie start,beenden und Highscore angezeigt...


    Meinst du damit, dass bei dir kein Text erscheint?
    Wenn ja liegt das daran, dass dir die Schriftart fehlt. Ich baue gerade Sprengers Vorschlag mit MemFont ein. :thumbup: