Hallo!
Ich habe 2 Fragen:
1.) Ich mache gerade eine eigene Version des Spiels Breakout und es klappt bis jetzt ganz gut. Die Kollision des Balles mit den Wänden und dem Schläger funktioniert, leider aber nicht die des Balles mit den Ziegelsteinen.
Vorweg ein paar Infos:
Den Ball
[autoit]Global $ball[3] = [200, 300, 20] ; x, y, width
Global $ballSpeed = 8
Global $ballVX = $ball[0]
Global $ballVY = $ballSpeed
zeichne ich mit
_GDIPlus_GraphicsFillEllipse($hGraphics, $ball[0], $ball[1], $ball[2], $ball[2], $brush_ball)
[/autoit]Die Ziegelsteine
[autoit]Global $brick_width = 50
Global $brick_height = 25
Dim $bricks[10][4] ; [amount of bricks][x, y, brush, life]
For $i = 0 To UBound($bricks)-1
$bricks[$i][0] = 10 + $i * ($brick_width+5)
$bricks[$i][1] = 10
$bricks[$i][2] = 0 ; Dies hier kann ignoriert werden. Ursprünglich wurde hier der Brush festgelegt, jetzt steht hier einfach
; zu Demonstrationszwecken 0, da ich alle Ziegel mit dem selben Brush $brush_brick färbe (s. unten)
$bricks[$i][3] = 1 ; der Einfachheit halber haben alle Ziegelsteine jeweils 1 Leben
Next
zeichne ich mit
For $i = 0 To UBound($bricks) - 1
If $bricks[$i][3] > 0 Then _GDIPlus_GraphicsFillRect($hGraphics, $bricks[$i][0], $bricks[$i][1], $brick_width, $brick_height, $brush_brick)
Next
Nach den ganzen Kollisionschecks setze ich die Koordinaten des Balles neu:
[autoit]$ball[0] += $ballVX
$ball[1] += $ballVY
So, jetzt zu dem Problem mit der Kollision Ball mit bricks:
[autoit]For $i = 0 To UBound($bricks)-1
If $bricks[$i][3] > 0 Then
If $ball[1] <= $bricks[$i][1] + $brick_height And $ball[1] >= $bricks[$i][1] Then
If $ball[0] + $ball[2] >= $bricks[$i][0] And $ball[0] <= $bricks[$i][0] + $brick_width Then ; von unten
$ballVY = -$ballVY
Else ; von links
$ballVX = -$ballVX
EndIf
$bricks[$i][3] -= 1 ; 1 Leben vom Stein abziehen, geht aber auch nicht (es wird komischerweise von der kompletten Reihe 1 Leben abgezogen)
ElseIf $ball[1] + $ball[2] >= $bricks[$i][1] And $ball[1] <= $bricks[$i][1] Then ; von oben
If $ball[0] + $ball[2] >= $bricks[$i][0] And $ball[0] <= $bricks[$i][0] + $brick_width Then
$ballVY = -$ballVY
Else ; von rechts
$ballVX = -$ballVX
EndIf
$bricks[$i][3] -= 1 ; 1 Leben vom Stein abziehen
EndIf
EndIf
Next
Die ist total bugged.... aber ich komme einfach nicht weiter
Was ich sagen kann ist, dass es funktioniert, dass, wenn der Ball von oben oder unten auf einen Ziegelstein trifft, er die Richtung entsprechend ändert. Manchmal jedoch schlüpft er einfach durch die nur einige Pixel großen Lücken zwischen den Steinen.
Naja und der Check von links/rechts funnktioniert nur sehr bugged....
2.) Im Moment sind die FPS während eines Spiels mit z.B. 120 bricks ca. 32. Wenn aber einige bricks zerstört wurden und demnach nicht mehr gezeichnet werden (s. oben), steigen die FPS auf ein maximum von ca. 64 (wenn alle bricks zerstört wurden).
Dagegen hätte ich absolut nichts, wenn das komplette Spiel dadurch nicht schneller würde... es wird dann alles doppelt so schnell dargestellt und das möchte ich verhindern, aber wie? Vielleicht manuell die FPS senken? Hm...
Ich wäre sehr dankbar für eure Hilfe