Dodge the bullet (GDI+)

  • Hey, die Tage hatte jmd ein Spiel geschrieben was sich PUNKTI nannte, es war eigentlich sehr lustig, nur etwas verbugt und mit Controls gemacht...

    Ich hab angefangen es ein wenig umzuschreiben in GDI+ an sich ist es nichts schweres, doch ich konnte ein wenig üben mit Hex zu arbeiten :)

    Zur Steuerung:
    Das Viereck mit dem Schweif bewegt sich immer nach rechts. Man muss den blinkenden Kugeln ausweichen, wenn man nach links klick bleibt das Viereck stehen, doch man verliert Punkte. Wenn man nach rechts klickt wird man schneller und bekommt mehr Punkte. Lenken kann man indem man nach oben bzw unten klickt.
    Jedes mal wenn man die andere Seite erreicht werden mehr Kugeln hinzugefügt, dadurch wird es schwerer.

    Ich hoffe euch gefällt das kleine Spiel und ihr könnt vllt ein paar Teile gebrauchen.

    Dodge the bullet
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_outfile=..\Punkterennen.exe
    #AutoIt3Wrapper_UseX64=n
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>
    #include <Array.au3>

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

    ;;;>>>>> BUGS!!!!:::
    ;;; - Wenn man eine Kollision verursacht nachdem man Level 1 geschafft hat > Error z. 92. Array hat falsche Anzahl!?
    ;;;
    Global $oi

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

    _GDIPlus_Startup()
    Opt("GUIOnEventMode", 1)
    ;; >> GUI Variablen
    Global $iWidth = 800, $iHeight = 400
    Global $start = 8
    ;; >> Spielfigur Variablen
    Global $Spieler_Speed = 10, $TimerInit = TimerInit(), $Startzeit = TimerInit(), $ChangeColorTime = TimerInit()
    Global $Spieler_Height = $Spieler_Speed, $Spieler_Width = $Spieler_Speed, $Spieler_X = 10, $Spieler_Y = ($iHeight - 80) / 2 - $Spieler_Height
    Global $Min_Speed = 50, $Max_Speed = 20, $Spieler_Geschwindigkeit = $Min_Speed

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

    Global $altX = $Spieler_X, $altY = $Spieler_Y

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

    Global $Schweif = 20
    Dim $aSpieler_Pos[$Schweif][3]
    For $i = 0 To UBound($aSpieler_Pos) - 1
    $aSpieler_Pos[$i][0] = 0
    $aSpieler_Pos[$i][1] = $Spieler_Y
    $aSpieler_Pos[$i][2] = _GDIPlus_BrushCreateSolid("0x" & Hex(((250 / $Schweif) * $i), 2) & "FF0000")
    Next

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

    ;; >> Gegner Variablen
    Global $iGegnerAnzahl = 50 ;;; 50 +10!!!! WARUM!!?!?!?!
    Dim $aGegner[$iGegnerAnzahl][3]
    ;; 0 = X
    ;; 1 = Y
    ;; 2 = BRUSH
    For $i = 0 To UBound($aGegner) - 1
    ;;>> X
    $aGegner[$i][0] = (Random($start, ($iWidth - $Spieler_Speed) / $Spieler_Speed, 1)) * 10
    $aGegner[$i][1] = (Random(0, (($iHeight - 80) - $Spieler_Speed) / $Spieler_Speed, 1)) * 10
    $aGegner[$i][2] = _GDIPlus_BrushCreateSolid("0xFF" & Hex(Random(99999999, 999999999), 6))
    Next
    ;; SoNSTIGE VARIABLEN
    Global $Punkte = 0, $PunktePlus = 1
    $hWnd = GUICreate("Game", $iWidth, $iHeight, -1, -1, $WS_POPUP)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetState()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    $Spieler_hBrush = _GDIPlus_BrushCreateSolid("0x" & Hex(1000, 2) & "ff0000")
    $hPen = _GDIPlus_PenCreate(0xff0000ff, 4)
    $hPenKreis = _GDIPlus_PenCreate(0xffff0000, 10)

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

    While 1
    Sleep(20)
    _GDIPlus_GraphicsClear($hBackbuffer, 0xffaaaaaa)
    ;; HINTERGRUND
    _GDIPlus_GraphicsFillRect($hBackbuffer, 0, 0, $iWidth, $iHeight - 80)

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

    ;; SPIELER
    _GDIPlus_GraphicsFillRect($hBackbuffer, $Spieler_X, $Spieler_Y, $Spieler_Width, $Spieler_Height, $Spieler_hBrush)

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

    $aSpieler_Pos[UBound($aSpieler_Pos) - 1][0] = $altX
    $aSpieler_Pos[UBound($aSpieler_Pos) - 1][1] = $altY

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

    For $i = 0 To UBound($aSpieler_Pos) - 1
    _GDIPlus_GraphicsFillRect($hBackbuffer, $aSpieler_Pos[$i][0], $aSpieler_Pos[$i][1], $Spieler_Width, $Spieler_Height, $aSpieler_Pos[$i][2])
    Next

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

    ;; Neue Pos setzen!
    _SetNewPlayerPos($Spieler_X, $Spieler_Y, $Spieler_Speed)
    ;; HINDERNISSe!
    For $i = 0 To UBound($aGegner) - 1
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, $aGegner[$i][0], $aGegner[$i][1], $Spieler_Width, $Spieler_Height, $aGegner[$i][2])
    Next

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

    ;; Strings!
    _GDIPlus_GraphicsDrawString($hBackbuffer, "Punkte: " & $Punkte, 0, $iHeight - 80, "Times", 14)
    $time = StringSplit((TimerDiff($Startzeit)), ".")
    $OptTime = StringLeft($time[1], StringLen($time[1]) - 3)
    _GDIPlus_GraphicsDrawString($hBackbuffer, "Zeit: " & $OptTime & " Sek.", 0, $iHeight - 60, "Times", 14)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight)
    _GetCollision()
    WEnd

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

    Func _GetCollision()
    For $qr = 0 To UBound($aGegner) - 1
    If $Spieler_X = $aGegner[$qr][0] And $Spieler_Y = $aGegner[$qr][1] Then
    $x = 0
    Do
    $hPenKreis = _GDIPlus_PenCreate("0x" & Hex($x / 10, 2) & "ff0000", 10)
    $x += 20
    _GDIPlus_GraphicsClear($hBackbuffer, 0xffaaaaaa)
    ;; HINTERGRUND
    _GDIPlus_GraphicsFillRect($hBackbuffer, 0, 0, $iWidth, $iHeight - 80)
    ;; SPIELER
    _GDIPlus_GraphicsFillRect($hBackbuffer, $Spieler_X, $Spieler_Y, $Spieler_Width, $Spieler_Height, $Spieler_hBrush)
    $aSpieler_Pos[UBound($aSpieler_Pos) - 1][0] = $altX
    $aSpieler_Pos[UBound($aSpieler_Pos) - 1][1] = $altY
    For $t = 0 To UBound($aSpieler_Pos) - 1
    _GDIPlus_GraphicsFillRect($hBackbuffer, $aSpieler_Pos[$t][0], $aSpieler_Pos[$t][1], $Spieler_Width, $Spieler_Height, $aSpieler_Pos[$t][2])
    Next
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, $aGegner[$qr][0], $aGegner[$qr][1], $Spieler_Width, $Spieler_Height, $aGegner[$qr][2])
    _GDIPlus_GraphicsDrawLine($hBackbuffer, $aGegner[$qr][0], $aGegner[$qr][1] - 2, $aGegner[$qr][0] + $Spieler_Width, $aGegner[$qr][1] + $Spieler_Height, $hPen)
    _GDIPlus_GraphicsDrawLine($hBackbuffer, $aGegner[$qr][0], $aGegner[$qr][1] + $Spieler_Height - 1, $aGegner[$qr][0] + $Spieler_Width, $aGegner[$qr][1], $hPen)

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

    _GDIPlus_GraphicsDrawArc($hBackbuffer, ($aGegner[$qr][0] + $Spieler_Width / 2) - $x / 3, ($aGegner[$qr][1] + $Spieler_Height / 2) - $x / 3, $x / 1.5, $x / 1.5, 0, 360, $hPenKreis)
    _GDIPlus_GraphicsDrawArc($hBackbuffer, ($aGegner[$qr][0] + $Spieler_Width / 2) - $x / 2, ($aGegner[$qr][1] + $Spieler_Height / 2) - $x / 2, $x, $x, 0, 360, $hPenKreis)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight)
    Until $x = 1500
    If MsgBox(4, "Verloren", "Du bist kollidiert. Das Spiel ist aus." & @CRLF & "Punkte: " & $Punkte & @CRLF & "Zeit: " & $OptTime & " Sek." & @CRLF & "Möchtest du nochmal Spielen?") = 7 Then
    _exit()
    EndIf

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

    ;; WENN TOT!!!
    $Punkte = 0
    $Startzeit = TimerInit()
    $Spieler_X = 10
    $Spieler_Y = ($iHeight - 80) / 2 - $Spieler_Height
    $iGegnerAnzahl = 50
    For $k = 0 To UBound($aSpieler_Pos) - 1
    $aSpieler_Pos[$k][0] = 0
    $aSpieler_Pos[$k][1] = $Spieler_Y
    Next

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

    Global $iGegnerAnzahl = 50
    ReDim $aGegner[$iGegnerAnzahl][3]
    ;; 0 = X
    ;; 1 = Y
    ;; 2 = BRUSH
    For $t = 0 To UBound($aGegner) - 1
    ;;>> X
    $aGegner[$t][0] = (Random($start, ($iWidth - $Spieler_Speed) / $Spieler_Speed, 1)) * 10
    $aGegner[$t][1] = (Random(0, (($iHeight - 80) - $Spieler_Speed) / $Spieler_Speed, 1)) * 10
    $aGegner[$t][2] = _GDIPlus_BrushCreateSolid("0xFF" & Hex(Random(99999999, 999999999), 6))
    Next
    Return
    EndIf
    Next
    EndFunc ;==>_GetCollision

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

    Func _SetNewPlayerPos(ByRef $x, ByRef $Y, ByRef $Speed)
    If TimerDiff($ChangeColorTime) >= 500 Then
    For $l = 0 To UBound($aGegner) - 1
    _GDIPlus_BrushDispose($aGegner[$l][2])
    Next
    For $l = 0 To UBound($aGegner) - 1
    ;;>> X
    $aGegner[$l][2] = _GDIPlus_BrushCreateSolid("0xFF" & Hex(Random(99999999, 999999999), 6))
    Next
    $ChangeColorTime = TimerInit()
    EndIf
    If TimerDiff($TimerInit) >= $Spieler_Geschwindigkeit Then
    $altX = $x
    $altY = $Y
    $Punkte += $PunktePlus
    $x += $Speed
    For $m = 0 To UBound($aSpieler_Pos) - 2
    $aSpieler_Pos[$m][0] = $aSpieler_Pos[$m + 1][0]
    $aSpieler_Pos[$m][1] = $aSpieler_Pos[$m + 1][1]
    Next
    $TimerInit = TimerInit()
    If Not _IsPressed(25) Then
    $Speed = $Spieler_Width
    $PunktePlus = 1
    EndIf
    If _IsPressed(25) Then
    $PunktePlus = -1
    $Speed = 0
    EndIf
    If _IsPressed(26) And $Spieler_Y >= $Spieler_Height Then $Spieler_Y -= $Speed;; OBEN
    If _IsPressed(28) And $Spieler_Y <= ($iHeight - 80) - $Spieler_Width * 2 Then $Spieler_Y += $Speed;; UNTEN
    If _IsPressed(27) And Not _IsPressed(25) Then $Spieler_Geschwindigkeit = $Max_Speed ;; RECHTS
    If Not _IsPressed(27) Then $Spieler_Geschwindigkeit = $Min_Speed ;; Wieder langsamer

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

    ;; WENN NEUES LEVEL!
    If $Spieler_X >= $iWidth Then
    $iGegnerAnzahl += 10
    ReDim $aGegner[$iGegnerAnzahl][3]
    $Spieler_X = 0
    For $q = 0 To UBound($aGegner) - 1
    ;;>> X
    $aGegner[$q][0] = (Random($start, ($iWidth - $Spieler_Speed) / $Spieler_Speed, 1)) * 10
    $aGegner[$q][1] = (Random(0, (($iHeight - 80) - $Spieler_Speed) / $Spieler_Speed, 1)) * 10
    $aGegner[$q][2] = _GDIPlus_BrushCreateSolid("0xFF" & Hex(Random(99999, 999999), 6))
    Next
    EndIf
    EndIf
    EndFunc ;==>_SetNewPlayerPos
    Func _exit()
    For $i = 0 To UBound($aSpieler_Pos) - 1
    _GDIPlus_BrushDispose($aSpieler_Pos[$i][2])
    Next
    For $i = 0 To UBound($aGegner) - 1
    _GDIPlus_BrushDispose($aGegner[$i][2])
    Next
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BrushDispose($Spieler_hBrush)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_exit

    [/autoit]

    Würde mich über Feedback, Lob und Bugs freuen.

    Bekannte Bugs

    Noch keine

    Behobene Bugs

    Noch keine

  • Nette Umsetzung!

    Warum kann ich nicht das Spiel neustarten, wenn ich verloren habe? Ein Spielstart Knopf wäre auch nicht schlecht.

    Füge

    [autoit]

    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)

    [/autoit]

    hinzu, damit die Punkte besser aussehen.

    Eine Highscore wäre auch nicht schlecht!


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (6. April 2011 um 20:20)

  • Danke für die Tips, das muss ich mir merken ;)

    Eine Frage ob man nochmal spielen will wurde jetzt auf die schnelle in die MsgBox gebastelt. Den Highscore mache ich morgen. Wonach soll er sortiert werden? Wer am längsten überlebt hat und wenn jmd. gleichlange dann entscheidet die Punktzahl?

  • Ein paar verbesserungsvorschläge:
    - Highscore in Ini-Datei schreiben lassen und in die Appdata werfen.
    - Nach der msgbox nicht einfach exit, sondern vielleicht ein Menü entwerfen (Neues Spiel, Highscore, Credits etc.)

    Ansonsten gefällt mir das Spiel sehr gut ;)

    Mfg