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
#include <GUIConstantsEx.au3>
#include <ScreenCapture.au3>
#include <GdiPlus.au3>
#include "Bass.au3"
#include <Misc.au3>
Opt("GUIOnEventMode", 1)
OnAutoItExitRegister("_Global_Exit")
_GDIPlus_Startup()
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)
$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)
$Dummy01 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_DelAll")
$Dummy02 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Pause")
Dim $aAccelKeys_hGUI[2][2] = [["{F1}", $Dummy01],["{F2}", $Dummy02]]
GUISetAccelerators($aAccelKeys_hGUI, $hMainGUI)
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)
$hWeapon = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\images\weapon.png")
$iWaffe_X = _GDIPlus_ImageGetWidth($hWeapon)
$iWaffe_Y = _GDIPlus_ImageGetHeight($hWeapon)
$iWaffe_Verhaltniss = $iWaffe_Y / $iWaffe_X
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
_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)
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)
While 1
_UpDateStat()
_GDIPlus_GraphicsDrawImageRect($hGraphic_Buffer, $hBitmap, 0, 0, $iScreen_X, $iScreen_Y)
_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)
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
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
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
Func _AddTreffer($iLeftPos, $iTopPos)
If $iLeftPos < 120 And $iTopPos < 120 Then Return -1
If TimerDiff($iMagazinLadWait) < 2000 Then Return -2
$iLeftPos -= 25
$iTopPos -= 18
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
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
Func _NextTrefferID()
For $i = 1 To UBound($aScreenTreffer) - 1 Step 1
If $aScreenTreffer[$i][0] = -1 Then Return $i
Next
ReDim $aScreenTreffer[UBound($aScreenTreffer) + 1][3]
Return UBound($aScreenTreffer) - 1
EndFunc ;==>_NextTrefferID
Func _LoadMagazin()
If TimerDiff($iMagazinWait) > 5000 Then
_BASS_ChannelPlay($sLoad, 1)
$iCountShoot = 0
$iMagazin += 1
$iMagazinWait = TimerInit()
$iMagazinLadWait = TimerInit()
EndIf
EndFunc ;==>_LoadMagazin
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
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
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
Func _exit()
Exit
EndFunc ;==>_exit
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
ich hoffe es gefällt euch
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