Desktop Shooter

  • Hallo leute,

    ich habe mal aus langerweile schnell ein kleines Spiel gecodet :)
    vllt. begegnet euch ja auch der Weihnachtsmann im Spiel xD

    Beschreibung:
    In dem Spiel geht es darum alle "Personen" die auf dem Desktop erscheinen zu erschießen in einer Statistik oben links stehen diverse Infos wie:
    - aktuelles Level
    - Kills zum nächsten level
    - Gesammte Schüsse
    - wie viele Magazine man schon benutzt hat
    - wie viele Schüsse das Magazin noch hat / maximal hat
    - die Trefferquote
    - wie viele gegner getroffen worden und wie viele es gab
    Je höher das Level, desto mehr Gegner kommen und desto schneller verschwinen sie wieder, zudem bekommt man mehr Schüsse pro magazin und die Lebenspunkte der Gegner erhöhen sich!

    Tastenbelegung:
    Linke Maustaste = Schießen
    Rechte Maustaste = Magazin neuladen
    F1 = alle treffer vom desktop entfehrnen
    F2 = Pause
    ESC = Beenden

    Programmcode

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <ScreenCapture.au3>
    #include <GdiPlus.au3>
    #include "Bass.au3"
    #include <Misc.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Global_Exit")
    _GDIPlus_Startup()

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

    Global $aScreenTreffer[1][3], $iCountShoot = 0, $iMaxSchusse = 10, $aGegner[26][11], $aTrefferImg[6], $iLeben = 5, $iGegnerMove = 5
    Global $iNextGegnerTime = 5000, $iTimerNextGegner = TimerInit(), $iGegnerHP = 1, $iMagazinLadWait = TimerInit(), $FPS_Timer = TimerInit(), $FPS_Count = 0, $FPS_Save = 0
    Global $iLevel = 1, $iSchusse = 0, $iMagazin = 1, $iQuote = 0, $iMaxTreffer = 0, $iTreffer = 0, $iLevelMultiplikator = 10, $iMagazinWait = TimerInit()
    $iScreen_X = @DesktopWidth + 1
    $iScreen_Y = @DesktopHeight
    MouseMove($iScreen_X, $iScreen_Y, 1)
    $hScreen = _ScreenCapture_Capture("", 0, 0, $iScreen_X, $iScreen_Y)

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

    $hMainGUI = GUICreate("Desktop Shooter 1.0", $iScreen_X, $iScreen_Y)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit", $hMainGUI)
    GUISetCursor(16, 1, $hMainGUI)
    MouseMove($iScreen_X / 2, $iScreen_Y / 2, 1)

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

    $Dummy01 = GUICtrlCreateDummy()
    GUICtrlSetOnEvent(-1, "_DelAll")
    $Dummy02 = GUICtrlCreateDummy()
    GUICtrlSetOnEvent(-1, "_Pause")
    Dim $aAccelKeys_hGUI[2][2] = [["{F1}", $Dummy01],["{F2}", $Dummy02]]
    GUISetAccelerators($aAccelKeys_hGUI, $hMainGUI)

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

    GUISetState(@SW_SHOW, $hMainGUI)

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

    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hScreen)

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hMainGUI)
    $hGraphic_buf = _GDIPlus_BitmapCreateFromGraphics($iScreen_X, $iScreen_Y, $hGraphic)
    $hGraphic_Buffer = _GDIPlus_ImageGetGraphicsContext($hGraphic_buf)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFF00)

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

    $hWeapon = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\images\weapon.png")
    $iWaffe_X = _GDIPlus_ImageGetWidth($hWeapon)
    $iWaffe_Y = _GDIPlus_ImageGetHeight($hWeapon)
    $iWaffe_Verhaltniss = $iWaffe_Y / $iWaffe_X

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

    For $i = 1 To 6
    $aTrefferImg[$i - 1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\images\treffer_" & $i & ".png")
    Next
    For $i = 1 To 26
    $aGegner[$i - 1][0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\player\Chara (" & $i & ").PNG")
    $aGegner[$i - 1][1] = 0 ; Anzahl Gekillt
    $aGegner[$i - 1][2] = 0 ; Anzahl Erschienen
    $aGegner[$i - 1][3] = -1 ; X_POS
    $aGegner[$i - 1][4] = -1 ; Y_POS
    $aGegner[$i - 1][5] = _GDIPlus_ImageGetWidth($aGegner[$i - 1][0]) ; X_Breite
    $aGegner[$i - 1][6] = _GDIPlus_ImageGetHeight($aGegner[$i - 1][0]) ; Y_Höhe
    $aGegner[$i - 1][7] = 0 ; Status
    $aGegner[$i - 1][8] = 1 ; HP
    $aGegner[$i - 1][9] = -1 ; New X_POS
    $aGegner[$i - 1][10] = -1 ; New Y_POS
    Next

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

    _BASS_STARTUP()
    _BASS_Init(0, -1, 44100, 0, "")
    $sShoot = _BASS_StreamCreateFile(False, @ScriptDir & "\sound\waffe-1.wav", 0, 0, 0)
    $sShoot2 = _BASS_StreamCreateFile(False, @ScriptDir & "\sound\waffe-2.wav", 0, 0, 0)
    $sLoad = _BASS_StreamCreateFile(False, @ScriptDir & "\sound\waffeladen.wav", 0, 0, 0)
    $sShootNot = _BASS_StreamCreateFile(False, @ScriptDir & "\sound\waffeleer.wav", 0, 0, 0)

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

    Do
    _GDIPlus_GraphicsDrawImageRect($hGraphic_Buffer, $hBitmap, 0, 0, $iScreen_X, $iScreen_Y)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Press Enter to START", $iScreen_X / 5, $iScreen_Y / 3, "Comic Sans MS", 46)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hGraphic_buf, 0, 0)
    Sleep(50)
    Until _IsPressed("0D")
    $iTimerNextGegner = TimerInit()
    $FPS_Timer = TimerInit()
    _BASS_ChannelPlay($sLoad, 1)

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

    While 1
    _UpDateStat()
    _GDIPlus_GraphicsDrawImageRect($hGraphic_Buffer, $hBitmap, 0, 0, $iScreen_X, $iScreen_Y)

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

    _GDIPlus_GraphicsFillRect($hGraphic_Buffer, 0, 0, 120, 120, $hBrush)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Level: " & $iLevel, 2, 2)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Leben: " & $iLeben, 2, 16)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Next Lvl: " & $iTreffer & " / " & $iLevel * $iLevelMultiplikator, 2, 30)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Ges. Schüsse: " & $iSchusse, 2, 44)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Magazine: " & $iMagazin, 2, 58)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Schüsse: " & $iCountShoot & " / " & $iMaxSchusse, 2, 72)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Trefferquote: " & $iQuote, 2, 86)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Kills: " & $iTreffer & " / " & $iMaxTreffer, 2, 100)

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

    If TimerDiff($iTimerNextGegner) > $iNextGegnerTime Then _CreateNewGegner()
    $aCur = GUIGetCursorInfo($hMainGUI)
    If $aCur[2] = 1 Then _AddTreffer($aCur[0], $aCur[1])
    If $aCur[3] = 1 Then _LoadMagazin()
    For $i = 1 To UBound($aScreenTreffer) - 1 Step 1
    If $aScreenTreffer[$i][0] = -1 Then ContinueLoop
    If $aScreenTreffer[$i][2] > 2 Then
    $iX = 26
    $iY = 24
    Else
    $iX = 11
    $iY = 11
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hGraphic_Buffer, $aTrefferImg[$aScreenTreffer[$i][2]], $aScreenTreffer[$i][0], $aScreenTreffer[$i][1], $iX, $iY)
    Next
    For $i = 0 To UBound($aGegner, 1) - 1 Step 1
    If $aGegner[$i][7] = 0 Then ContinueLoop
    If $aGegner[$i][9] > $aGegner[$i][3] Then
    $aGegner[$i][3] += $iGegnerMove
    ElseIf $aGegner[$i][9] < $aGegner[$i][3] Then
    $aGegner[$i][3] -= $iGegnerMove
    EndIf
    If $aGegner[$i][10] > $aGegner[$i][4] Then
    $aGegner[$i][4] += $iGegnerMove
    ElseIf $aGegner[$i][10] < $aGegner[$i][4] Then
    $aGegner[$i][4] -= $iGegnerMove
    EndIf
    If $aGegner[$i][3] > $aGegner[$i][9] - 10 And $aGegner[$i][3] < $aGegner[$i][9] + 10 Then $aGegner[$i][9] = $aGegner[$i][3]
    If $aGegner[$i][4] > $aGegner[$i][10] - 10 And $aGegner[$i][4] < $aGegner[$i][10] + 10 Then $aGegner[$i][10] = $aGegner[$i][4]
    If $aGegner[$i][3] = $aGegner[$i][9] Then $aGegner[$i][9] = Random($aGegner[$i][5], $iScreen_X - $aGegner[$i][5], 1) ; New X_POS
    If $aGegner[$i][4] = $aGegner[$i][10] Then $aGegner[$i][10] = Random($aGegner[$i][6], $iScreen_Y - $aGegner[$i][6], 1) ; New Y_POS
    _GDIPlus_GraphicsDrawImageRect($hGraphic_Buffer, $aGegner[$i][0], $aGegner[$i][3], $aGegner[$i][4], $aGegner[$i][5], $aGegner[$i][6])
    Next
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, $FPS_Save & " FPS", 2, $iScreen_Y - 50)
    _GDIPlus_GraphicsDrawImageRect($hGraphic_Buffer, $hWeapon, $aCur[0], $aCur[1], 200, 200 * $iWaffe_Verhaltniss)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hGraphic_buf, 0, 0)
    $FPS_Count += 1
    If TimerDiff($FPS_Timer) >= 1000 Then
    $FPS_Timer = TimerInit()
    $FPS_Save = $FPS_Count
    $FPS_Count = 0
    EndIf
    Sleep(20)
    WEnd

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

    Func _CreateNewGegner()
    Local $tmpGegnerID, $i, $iMaxGegner = 1, $iMinWait = 4000, $iMaxWait = 8000
    Switch $iLevel
    Case 1
    $iMaxGegner = 1
    $iMinWait = 4000
    $iMaxWait = 8000
    $iMaxSchusse = 10
    Case 2
    $iMaxGegner = 1
    $iMinWait = 4000
    $iMaxWait = 8000
    $iMaxSchusse = 15
    $iLevelMultiplikator = 10
    $iGegnerHP = 2
    $iGegnerMove = 6
    Case 3
    $iMaxGegner = 2
    $iMinWait = 4000
    $iMaxWait = 8000
    $iMaxSchusse = 15
    $iLevelMultiplikator = 15
    $iGegnerHP = 1
    Case 4
    $iMaxGegner = 2
    $iMinWait = 4000
    $iMaxWait = 8000
    $iMaxSchusse = 20
    $iLevelMultiplikator = 20
    $iGegnerHP = 2
    $iGegnerMove = 7
    Case 5 To 7
    $iMaxGegner = 3
    $iMinWait = 3000
    $iMaxWait = 7000
    $iMaxSchusse = 25
    $iLevelMultiplikator = 25
    $iGegnerHP = 2
    $iGegnerMove = 8
    Case 8
    $iMaxGegner = 4
    $iMinWait = 3000
    $iMaxWait = 6000
    $iMaxSchusse = 35
    $iLevelMultiplikator = 30
    $iGegnerHP = 2
    Case 9
    $iMaxGegner = 4
    $iMinWait = 2000
    $iMaxWait = 5000
    $iMaxSchusse = 40
    $iLevelMultiplikator = 35
    $iGegnerHP = 3
    $iGegnerMove = 9
    Case Else
    $iMaxGegner = 6
    $iMinWait = 2000
    $iMaxWait = 4000
    $iMaxSchusse = 50
    $iLevelMultiplikator = 40
    $iGegnerHP = 4
    $iGegnerMove = 10
    EndSwitch
    $iTimerNextGegner = TimerInit()
    $iNextGegnerTime = Random($iMinWait, $iMaxWait, 1)
    For $i = 0 To UBound($aGegner, 1) - 1
    $aGegner[$i][7] = 0
    Next
    For $a = 1 To $iMaxGegner Step 1
    $tmpGegnerID = Random(0, UBound($aGegner, 1) - 1, 1)
    If $aGegner[$tmpGegnerID][7] = 1 Then ContinueLoop
    If $tmpGegnerID <> 12 And $tmpGegnerID <> 16 Then $aGegner[$tmpGegnerID][2] += 1 ; Anzahl Erschienen
    $aGegner[$tmpGegnerID][3] = Random($aGegner[$tmpGegnerID][5], $iScreen_X - $aGegner[$tmpGegnerID][5], 1) ; X_POS
    $aGegner[$tmpGegnerID][4] = Random($aGegner[$tmpGegnerID][6], $iScreen_Y - $aGegner[$tmpGegnerID][6], 1) ; Y_POS
    $aGegner[$tmpGegnerID][7] = 1 ; Status
    $aGegner[$tmpGegnerID][8] = $iGegnerHP ; HP
    $aGegner[$tmpGegnerID][9] = Random($aGegner[$tmpGegnerID][5], $iScreen_X - $aGegner[$tmpGegnerID][5], 1) ; New X_POS
    $aGegner[$tmpGegnerID][10] = Random($aGegner[$tmpGegnerID][6], $iScreen_Y - $aGegner[$tmpGegnerID][6], 1) ; New Y_POS
    Next
    EndFunc ;==>_CreateNewGegner

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

    Func _UpDateStat()
    Local $i, $iKills = 0, $iCreate = 0, $iCountActiv = 0
    For $i = 0 To UBound($aGegner, 1) - 1
    If $i = 12 Or $i = 16 Then ContinueLoop
    $iKills += $aGegner[$i][1]
    $iCreate += $aGegner[$i][2]
    If $aGegner[$i][7] = 1 Then $iCountActiv += 1
    Next
    $iQuote = Round($iKills / ($iCreate - $iCountActiv), 3) * 100
    If Not IsInt($iQuote) Then $iQuote = 0
    $iMaxTreffer = $iCreate - $iCountActiv
    $iTreffer = $iKills
    If $iTreffer >= $iLevel * $iLevelMultiplikator Then
    $iLevel += 1
    $iLeben += 1
    EndIf
    If $iLeben < 1 Then _GameOver()
    EndFunc ;==>_UpDateStat

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

    Func _AddTreffer($iLeftPos, $iTopPos)
    If $iLeftPos < 120 And $iTopPos < 120 Then Return -1
    If TimerDiff($iMagazinLadWait) < 2000 Then Return -2
    $iLeftPos -= 25
    $iTopPos -= 18

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

    If $iCountShoot < $iMaxSchusse Then
    Local $tmpID = _NextTrefferID(), $fTreffer = 0
    If Random() > 0.5 Then
    _BASS_ChannelPlay($sShoot, 1)
    Else
    _BASS_ChannelPlay($sShoot2, 1)
    EndIf
    For $i = 0 To UBound($aGegner, 1) - 1
    If $aGegner[$i][7] = 0 Then ContinueLoop
    If $iLeftPos >= $aGegner[$i][3] And $iLeftPos <= $aGegner[$i][3] + $aGegner[$i][5] And $iTopPos >= $aGegner[$i][4] And $iTopPos <= $aGegner[$i][4] + $aGegner[$i][6] Then
    If $i = 12 Or $i = 16 Then $iLeben -= 1
    If $aGegner[$i][8] > 1 Then
    $aGegner[$i][8] -= 1
    $fTreffer = 1
    Else
    $aGegner[$i][7] = 0
    $aGegner[$i][1] += 1
    $aGegner[$i][8] = 0
    $fTreffer = 1
    EndIf
    EndIf
    Next

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

    If $fTreffer = 1 Then
    $aScreenTreffer[$tmpID][2] = Random(3, 5, 1)
    $aScreenTreffer[$tmpID][0] = $iLeftPos - 10 + Random(-4, 4, 1)
    $aScreenTreffer[$tmpID][1] = $iTopPos - 10 + Random(-4, 4, 1)
    Else
    $aScreenTreffer[$tmpID][2] = Random(0, 2, 1)
    $aScreenTreffer[$tmpID][0] = $iLeftPos - 5 + Random(-4, 4, 1)
    $aScreenTreffer[$tmpID][1] = $iTopPos - 5 + Random(-4, 4, 1)
    EndIf
    $iCountShoot += 1
    $iSchusse += 1
    Else
    _BASS_ChannelPlay($sShootNot, 1)
    EndIf
    EndFunc ;==>_AddTreffer

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

    Func _NextTrefferID()
    For $i = 1 To UBound($aScreenTreffer) - 1 Step 1
    If $aScreenTreffer[$i][0] = -1 Then Return $i
    Next

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

    ReDim $aScreenTreffer[UBound($aScreenTreffer) + 1][3]
    Return UBound($aScreenTreffer) - 1
    EndFunc ;==>_NextTrefferID

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

    Func _LoadMagazin()
    If TimerDiff($iMagazinWait) > 5000 Then
    _BASS_ChannelPlay($sLoad, 1)
    $iCountShoot = 0
    $iMagazin += 1
    $iMagazinWait = TimerInit()
    $iMagazinLadWait = TimerInit()
    EndIf
    EndFunc ;==>_LoadMagazin

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

    Func _DelAll()
    For $i = 1 To UBound($aScreenTreffer) - 1 Step 1
    $aScreenTreffer[$i][0] = -1
    $aScreenTreffer[$i][1] = -1
    $aScreenTreffer[$i][2] = 0
    Next
    EndFunc ;==>_DelAll

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

    Func _Pause()
    Do
    _GDIPlus_GraphicsDrawImageRect($hGraphic_Buffer, $hBitmap, 0, 0, $iScreen_X, $iScreen_Y)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Press Enter to CONTINUE", $iScreen_X / 7, $iScreen_Y / 3, "Comic Sans MS", 46)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hGraphic_buf, 0, 0)
    Sleep(50)
    Until _IsPressed("0D")
    $iTimerNextGegner = TimerInit()
    EndFunc ;==>_Pause

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

    Func _GameOver()
    Do
    _GDIPlus_GraphicsDrawImageRect($hGraphic_Buffer, $hBitmap, 0, 0, $iScreen_X, $iScreen_Y)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "GAME OVER", $iScreen_X / 4, $iScreen_Y / 4, "Comic Sans MS", 64)
    _GDIPlus_GraphicsDrawString($hGraphic_Buffer, "Press Enter to EXIT", $iScreen_X / 5, $iScreen_Y / 2.6, "Comic Sans MS", 46)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hGraphic_buf, 0, 0)
    Sleep(50)
    Until _IsPressed("0D")
    _exit()
    EndFunc ;==>_GameOver

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

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

    Func _Global_Exit()
    _GDIPlus_GraphicsDispose($hGraphic_Buffer)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hGraphic_buf)
    _GDIPlus_ImageDispose($hBitmap)
    _GDIPlus_ImageDispose($hWeapon)
    _GDIPlus_BrushDispose($hBrush)
    For $i = 0 To UBound($aTrefferImg) - 1
    _GDIPlus_ImageDispose($aTrefferImg[$i])
    Next
    For $i = 0 To UBound($aGegner, 1) - 1
    _GDIPlus_ImageDispose($aGegner[$i][0])
    Next
    _WinAPI_DeleteObject($hScreen)
    _GDIPlus_Shutdown()
    _BASS_Free()
    EndFunc ;==>_Global_Exit

    [/autoit]

    ich hoffe es gefällt euch :D
    kritik, lob ect. gerne erwünscht :)

    im anhang ist alles mit Bildern ect.

    mfg

    EDIT1: Danke für den hinweiß, fehlender Include ist nun drinn ;)

    EDIT2: habe kleine änderungen gemacht
    - Waffe geändert
    - wenn man jemanden trifft kommt jetzt ein Blutfleck
    - man kann nur alle 5 Sekunden das Magazin wechseln
    - das wechseln des Magazins braucht 2 Sekunden

    EDIT3: wieder ein paar änderungen :)
    - jetzt gibt es 5 Leben, für jedes levelup gibt es ein leben dazu
    - man darf den Weihnachtsmann und die Krankenschwester nicht töten, sonst verliert man ein Leben
    - die Personen bewegen sich über den Bildschirm, je nach Level unterschiedlich schnell
    - unten links wird die Framerate angezeigt
    - wenn man 0 Leben hat ist das Spiel zu ende => Game Over

  • - Also ich hab geschätzt 10 Bilder in der Sekunde, das is nicht so toll...
    - Und wenn man die linke und die rechte Maustaste gleichzeitig drück hat man unendlich munition...
    - Man kann in einer Sekunde geschätzte 10 mal das Magazin wechseln^^ --> Ich würd so machen, dass das Nachladen eine gewisse Zeit dauert..
    - Die Knarre gefällt mir nicht so gut.. :)

    Aber sonst is es cool^^ einfach die fps sind noch nicht so toll :)

    und was ich persöhnlich noch cool fände, ist wenn sich die figuren bewegen würden... :)