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"
#include <GDIPlus.au3>
#include <GuiConstants.au3>
#include <Misc.au3>
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
For $i = 0 To 5
$hBrush[$i] = _GDIPlus_BrushCreateSolid($hColor[$i])
Next
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
$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 *
Else
GUICtrlSetFont(-1, 20)
EndIf
GUISetState()
$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)
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
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
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
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
"Editor"
#include <GuiConstants.au3>
#include <ComboConstants.au3>
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()
Do
$nMsg = GUIGetMsg()
If $nMsg = $GUI_EVENT_CLOSE Then Exit
Until $nMsg = $hNext And GuiCtrlRead($hName) <> ""
$Rows = GuiCtrlRead($hRows)
$Colls = GuiCtrlRead($hColls)
$Touches = GuiCtrlRead($hTouches)
$Name = GuiCtrlRead($hName)
GuiDelete()
Global $aCells[$Rows][$Colls]
Global $hGui, $hDropdown[$Rows][$Colls][2], $hCreate, $hHelp
For $i = 0 To $Rows - 1
For $j = 0 To $Colls - 1
$aCells[$i][$j] = 0
Next
Next
$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()
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
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