Bubble Blast, v 0.1

  • Hi Forum,
    ich wollte mal mein Tagesprojekt vorstellen.
    Vllt kennen diejenigen, die glückliche Besitzer eines Android-Handys sind, das Spiel Bubble Blast.
    Dabei geht es darum, durch Klicken auf die Blasen eine Kettenreaktion auszulösen, da rote Blasen kleine Blasen in alle Himmelsrichtungen schicken, um weitere Blasen zu treffen.
    Ich wollte erst ein Programm schreiben, welches mir das Endergebnis einer Kettenreaktion ausrechnet, und naja, daraus ist ein Kleines SpielCHEN mit erbärmlicher Grafik geworden, welche ich evtl später verbessere.

    Mir sind so direkt keine Bugs bekannt, vllt findet ihr welche

    Bis jetzt enthalten: Source für Spiel + Editor, zwei Beispiellevel

    Kommen sollen: Bessere Performance (bin für jede Idee offen ;)), bessere Grafik, mehr Level, ein "Storymodus", evtl Multiplayermodus.

    "Spiel"
    [autoit]

    #include <GDIPlus.au3>
    #include <GuiConstants.au3>
    #include <Misc.au3>

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

    Opt('MouseCoordMode', 0)
    _GDIPlus_Startup()
    $Open = FileOpenDialog("Wähle Level", @ScriptDir, "ini (*.ini)")
    Global $Rows = IniRead($Open, "General", "x", 5), $Colls = IniRead($Open, "General", "y", 6), $Touches = IniRead($Open, "General", "touch", 5)
    Global $aCells[$Rows][$Colls], $aPops[$Rows][$Colls][4][2]
    Global $hGui, $hTouches
    Global $hBrush[6], $hColor[6] = [0xFF00000, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00, 0xFF0000FF], $hGraphic, $hBitmap, $hBuffer

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

    For $i = 0 To 5
    $hBrush[$i] = _GDIPlus_BrushCreateSolid($hColor[$i])
    Next

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

    For $i = 0 To $Rows - 1
    For $j = 0 To $Colls - 1
    $aCells[$i][$j] = IniRead($Open, "Map", ($i + 1) & ($j + 1), 1)
    For $k = 0 To 3
    $aPops[$i][$j][$k][0] = -1
    $aPops[$i][$j][$k][1] = -1
    Next
    Next
    Next

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

    $hGui = GUICreate("Bubble Blast", $Rows * 100, $Colls * 100 + 50, @DesktopWidth / 2 - ($Rows * 100 / 2), @DesktopHeight / 2 - ($Colls * 100 / 2))
    $hTouches = GUICtrlCreateLabel("Berührungen übrig: " & $Touches, 0, $Colls * 100, $Rows * 100, 50)
    If $Rows < 3 Then
    GUICtrlSetFont(-1, $Rows * 8)
    Else
    GUICtrlSetFont(-1, 20)
    EndIf
    GUISetState()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Rows * 100, $Colls * 100, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsClear($hBuffer)
    For $i = 0 To $Rows - 1
    For $j = 0 To $Colls - 1
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[$aCells[$i][$j]])
    Next
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $Rows * 100, $Colls * 100)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    If _IsPressed(01) And WinActive("Bubble Blast") Then
    $Pos = MouseGetPos()
    $X = ($Pos[0] - Mod($Pos[0], 100)) / 100
    $Y = ($Pos[1] - Mod($Pos[1], 100)) / 100
    If $X >= 0 And $X <= $Rows - 1 And $Y >= 0 And $Y <= $Colls - 1 Then
    If $aCells[$X][$Y] <> 0 Then
    $Touches -= 1
    GUICtrlSetData($hTouches, "Berührungen übrig: " & $Touches)
    _ClickBubble($X, $Y)
    Sleep(100)
    EndIf
    EndIf
    EndIf
    Sleep(40)
    WEnd

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

    Func _ClickBubble($iX, $iY)
    Local $iTest = 0
    _PopBubble($iX, $iY)
    _GDIPlus_GraphicsClear($hBuffer)
    For $i = 0 To $Rows - 1
    For $j = 0 To $Colls - 1
    $Color = $aCells[$i][$j]
    Select
    Case $Color = 0
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[0])
    Case $Color = 1
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[1])
    Case $Color = 2
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[2])
    Case $Color = 3
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[3])
    Case $Color = 4
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[4])
    EndSelect
    Next
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $Rows * 100, $Colls * 100)
    For $i = 0 To $Rows - 1
    For $j = 0 To $Colls - 1
    $iTest += $aCells[$i][$j]
    Next
    Next
    If $iTest > 0 And $Touches = 0 Then
    MsgBox(0, "Spiel zuende", "Du hast verloren")
    Exit
    ElseIf $iTest = 0 Then
    MsgBox(0, "Spiel zuende", "Du hast gewonnen")
    Exit
    EndIf
    EndFunc ;==>_ClickBubble

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

    Func _PopBubble($iX, $iY)
    If $iX >= 0 And $iY >= 0 Then
    If $aCells[$iX][$iY] > 0 Then
    _ChainPop($iX, $iY)
    Do
    For $i = 0 To ($Rows - 1)
    For $j = 0 To ($Colls - 1)
    If $aPops[$i][$j][0][0] <> -1 Then
    If $aPops[$i][$j][0][0] > 0 Then
    $aPops[$i][$j][0][0] -= 1
    If $aCells[$aPops[$i][$j][0][0]][$aPops[$i][$j][0][1]] <> 0 Then
    $iTempX = $aPops[$i][$j][0][0]
    $iTempY = $aPops[$i][$j][0][1]
    $aPops[$i][$j][0][0] = -1
    $aPops[$i][$j][0][1] = -1
    _ChainPop($iTempX, $iTempY)
    EndIf
    Else
    $aPops[$i][$j][0][0] = -1
    $aPops[$i][$j][0][1] = -1
    EndIf
    EndIf
    If $aPops[$i][$j][1][0] <> -1 Then
    If $aPops[$i][$j][1][1] > 0 Then
    $aPops[$i][$j][1][1] -= 1
    If $aCells[$aPops[$i][$j][1][0]][$aPops[$i][$j][1][1]] <> 0 Then
    $iTempX = $aPops[$i][$j][1][0]
    $iTempY = $aPops[$i][$j][1][1]
    $aPops[$i][$j][1][0] = -1
    $aPops[$i][$j][1][1] = -1
    _ChainPop($iTempX, $iTempY)
    EndIf
    Else
    $aPops[$i][$j][1][0] = -1
    $aPops[$i][$j][1][1] = -1
    EndIf
    EndIf
    If $aPops[$i][$j][2][0] <> -1 Then
    If $aPops[$i][$j][2][0] < ($Rows - 1) Then
    $aPops[$i][$j][2][0] += 1
    If $aCells[$aPops[$i][$j][2][0]][$aPops[$i][$j][2][1]] <> 0 Then
    $iTempX = $aPops[$i][$j][2][0]
    $iTempY = $aPops[$i][$j][2][1]
    $aPops[$i][$j][2][0] = -1
    $aPops[$i][$j][2][1] = -1
    _ChainPop($iTempX, $iTempY)
    EndIf
    Else
    $aPops[$i][$j][2][0] = -1
    $aPops[$i][$j][2][1] = -1
    EndIf
    EndIf
    If $aPops[$i][$j][3][0] <> -1 Then
    If $aPops[$i][$j][3][1] < ($Colls - 1) Then
    $aPops[$i][$j][3][1] += 1
    If $aCells[$aPops[$i][$j][3][0]][$aPops[$i][$j][3][1]] <> 0 Then
    $iTempX = $aPops[$i][$j][3][0]
    $iTempY = $aPops[$i][$j][3][1]
    $aPops[$i][$j][3][0] = -1
    $aPops[$i][$j][3][1] = -1
    _ChainPop($iTempX, $iTempY)
    EndIf
    Else
    $aPops[$i][$j][3][0] = -1
    $aPops[$i][$j][3][1] = -1
    EndIf
    EndIf
    Next
    Next
    For $h = 10 To 20
    _GDIPlus_GraphicsClear($hBuffer)
    For $i = 0 To $Rows - 1
    For $j = 0 To $Colls - 1
    If $aPops[$i][$j][0][0] <> -1 Then
    _GDIPlus_GraphicsFillEllipse($hBuffer, ($aPops[$i][$j][0][0] + 1) * 100 + 45 - $h * 10, $aPops[$i][$j][0][1] * 100 + 45, 10, 10, $hBrush[1])
    EndIf
    If $aPops[$i][$j][1][0] <> -1 Then
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aPops[$i][$j][1][0] * 100 + 45, ($aPops[$i][$j][1][1] + 1) * 100 + 45 - $h * 10, 10, 10, $hBrush[1])
    EndIf
    If $aPops[$i][$j][2][0] <> -1 Then
    _GDIPlus_GraphicsFillEllipse($hBuffer, ($aPops[$i][$j][2][0] - 1) * 100 + 45 + $h * 10, $aPops[$i][$j][2][1] * 100 + 45, 10, 10, $hBrush[1])
    EndIf
    If $aPops[$i][$j][3][0] <> -1 Then
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aPops[$i][$j][3][0] * 100 + 45, ($aPops[$i][$j][3][1] - 1) * 100 + 45 + $h * 10, 10, 10, $hBrush[1])
    EndIf
    Next
    Next
    For $i = 0 To $Rows - 1
    For $j = 0 To $Colls - 1
    $Color = $aCells[$i][$j]
    Select
    Case $Color = 0
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[0])
    Case $Color = 1
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[1])
    Case $Color = 2
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[2])
    Case $Color = 3
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[3])
    Case $Color = 4
    _GDIPlus_GraphicsFillEllipse($hBuffer, $i * 100 + 10, $j * 100 + 10, 80, 80, $hBrush[4])
    EndSelect
    Next
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $Rows * 100, $Colls * 100)
    Sleep(30)
    Next
    $iAll = ($Rows * $Colls) * 4
    For $i = 0 To ($Rows - 1)
    For $j = 0 To ($Colls - 1)
    For $k = 0 To 3
    $iAll += $aPops[$i][$j][$k][0]
    Next
    Next
    Next
    Until $iAll = 0
    EndIf
    EndIf
    EndFunc ;==>_PopBubble

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

    Func _ChainPop($iX, $iY)
    $aCells[$iX][$iY] -= 1
    If $aCells[$iX][$iY] = 0 Then
    For $i = 0 To 3
    $aPops[$iX][$iY][$i][0] = $iX
    $aPops[$iX][$iY][$i][1] = $iY
    Next
    EndIf
    EndFunc ;==>_ChainPop

    [/autoit]
    &quot;Editor&quot;
    [autoit]

    #include <GuiConstants.au3>
    #include <ComboConstants.au3>

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

    Global $Rows, $Colls, $Name

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

    Global $hName, $hRows, $hColls, $hTouches, $hNext

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

    GuiCreate("Einstellungen", 200, 100, @DesktopWidth / 2 - 100, @DesktopHeight / 2 - 50)
    GuiCtrlCreateLabel("Name:", 0, 0, 60, 25)
    GuiCtrlSetFont(-1, 15)
    $hName = GuiCtrlCreateInput("", 60, 0, 70, 25)
    GuiCtrlCreateLabel("x:", 0, 25, 20, 25)
    GuiCtrlSetFont(-1, 15)
    $hRows = GuiCtrlCreateCombo("3", 60, 25, 70, 25, $CBS_DROPDOWNLIST)
    GuiCtrlSetData(-1, "4|5|6|7|8|9")
    GuiCtrlCreateLabel("y:", 0, 50, 20, 25)
    GuiCtrlSetFont(-1, 15)
    $hColls = GuiCtrlCreateCombo("3", 60, 50, 70, 25, $CBS_DROPDOWNLIST)
    GuiCtrlSetData(-1, "4|5|6|7")
    GuiCtrlCreateLabel("Züge:", 0, 75, 50, 25)
    GuiCtrlSetFont(-1, 15)
    $hTouches = GuiCtrlCreateCombo("1", 60, 75, 70, 25, $CBS_DROPDOWNLIST)
    GuiCtrlSetData(-1, "2|3|4|5|6|7")
    $hNext = GuiCtrlCreateButton("Weiter", 130, 0, 70, 100)
    GuiSetState()

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

    Do
    $nMsg = GUIGetMsg()
    If $nMsg = $GUI_EVENT_CLOSE Then Exit
    Until $nMsg = $hNext And GuiCtrlRead($hName) <> ""

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

    $Rows = GuiCtrlRead($hRows)
    $Colls = GuiCtrlRead($hColls)
    $Touches = GuiCtrlRead($hTouches)
    $Name = GuiCtrlRead($hName)
    GuiDelete()

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

    Global $aCells[$Rows][$Colls]
    Global $hGui, $hDropdown[$Rows][$Colls][2], $hCreate, $hHelp

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

    For $i = 0 To $Rows - 1
    For $j = 0 To $Colls - 1
    $aCells[$i][$j] = 0
    Next
    Next

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

    $hGui = GUICreate("Bubble Blast Editor", $Rows * 50, $Colls * 50 + 50, @DesktopWidth / 2 - ($Rows * 50 /2), @DesktopHeight / 2 - ($Colls*50/2))
    For $i = 0 To $Rows - 1
    For $j = 0 To $Colls - 1
    $hDropdown[$i][$j][0] = GUICtrlCreateCombo("0", $i * 50 + 10, $j * 50, 30, 30, $CBS_DROPDOWNLIST)
    GuiCtrlSetData(-1, "1|2|3|4")
    Next
    Next
    $hCreate = GuiCtrlCreateButton("Erstellen", 0, $Colls * 50, $Rows*50*0.8, 50)
    $hHelp = GuiCtrlCreateButton("Hilfe", $Rows*50*0.8, $Colls * 50, $Rows*50*0.2, 50)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hCreate
    For $i = 0 to $Rows - 1
    For $j = 0 to $Colls - 1
    $aCells[$i][$j] = Number(GuiCtrlRead($hDropdown[$i][$j][0]))
    Next
    Next
    IniWrite(@ScriptDir & "/" & $Name & ".ini", "General", "x", $Rows)
    IniWrite(@ScriptDir & "/" & $Name & ".ini", "General", "y", $Colls)
    IniWrite(@ScriptDir & "/" & $Name & ".ini", "General", "Touch", $Touches)
    For $i = 1 to $Rows
    For $j = 1 to $Colls
    IniWrite(@ScriptDir & "/" & $Name & ".ini", "Map", $i&$j, $aCells[$i-1][$j-1])
    Next
    Next
    MsgBox(0, "Fertig", "Level erfolgreich im Editor-Verzeichnis erstellt")
    Case $hHelp
    MsgBox(0, "Hilfe", "Mit den Comboboxen stellt man die Stufe der Blase fest."&@CRLF&"0 bedeutet, dass keine Blase erscheint.")
    EndSwitch
    Sleep(40)
    WEnd

    [/autoit]


    An alle, die einigermaßen GDI+ können: ich habe mir zwar nicht sonderlich viel Mühe mit der Performance gegeben, aber wie wäre denn da noch was rauszuholen?
    Ihr könnt euch gerne an schönere Umsetzungen machen ;)

    MfG,
    Fresapore

  • ^^ Wie cool ist das denn, das Spiel hat echt Potenzial ( schriebt man das so ?( ). ich würde nur den Editor auch so gestalten wie das spiel, dass man bei der Combo nicht zwischen Nummern, sondern zwischen farben wählen kann, oder so ähnlich.

    Aber ich hätte zu dem noch eine Frage: WIE LÖSE ICH DAS ZWEITE LEVEL AHHH!!!^^ :thumbup: SUCHTFAKTOR GROSS!!

  • Absolut geiles spiel,
    derf ich einen Klon zur übung erstellen ? ich bin grad dabei die GDI funktionen zu lernen.
    Natürlich werde es nicht ohne deine Zustimmung / Referenz veröffentlichen

    -

  • Gut. Es funktioniert perfekt. Du könntest allerdings die Zeile _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2) einfügen, um die Kantenglättung zu verwenden. Dadurch sieht das ganze schon besser aus.
    Dann kannst du noch die ganzen Brushes beim schließen des Programmes wieder aus dem Arbeitsspeicher entfernen. Wenn du lustig bist, malst du noch ein paar Bilder für die "Bubbles" und den Hintergrund. ;)

  • Hei großes LOB!
    Das wollt ich auch schon mal machen...
    Ich hab ein paar selbst gezeichnete Bilder .. wenn du willst kannst du sie haben...
    Hab auch schon ein Paar Levels gemacht.. wobei mir auffällt dass du den Editor noch vereinfachen kannst..
    Aber cool..