'Breakout'-Klon

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

sheldon

Betreff: 'Breakout'-Klon

BeitragDo, Okt 16, 2008 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe hier auch mal so ein 'Breakout'-Klon gebastelt und wollte ihn euch vorstellen.
Er ist fast so wie jeder andere 'Breakout'-Klon.

"Features" :
- Damit es nicht zu langweilig wird, verändert der Ball alle 10 Sekunden seinen Winkel.
- Bei jeder Kollision des Balles mit dem Schläger oder einem Stein, erhöht sich die Geschwindigkeit um 0.05.

Bugs :
- Der Schläger kann den Ball 'aufsaugen', indem man ihn mit der rechten o. linken Seite berührt.

Code :
Code: [AUSKLAPPEN]
Graphics 800,600

SetBuffer BackBuffer()

SeedRnd MilliSecs()


Type Stein
   Field X#, Y#
   Field Image
End Type


Type Kugel
   Field X#, Y#, Speed#, Winkel
   Field Image
End Type

Global S.Stein, K.Kugel


Global PlayerX, PlayerY, PlayerSpeed
Global PlayerImage

Global GameOver = 0

Global Timer

Global BackGround

Global MNUAuswahl, AWLineY

Const NewGame = 1
Const Ende = 2


PlayerImage = CreateImage(30,5)

SetBuffer ImageBuffer(PlayerImage)
   Color 170,170,170
   Rect 0,0,50,50,0
   Color 200,200,200
   Rect 1,1,30,10
   
SetBuffer BackBuffer()

ScaleImage PlayerImage,3,3


BackGround = CreateImage(800,600)

SetBuffer ImageBuffer(BackGround)

   Color 255,255,255
   
   For Stars = 1 To 500
      Plot Rand(800),Rand(600)
   Next
   
SetBuffer BackBuffer()



Repeat

MNUAuswahl = NewGame


Repeat

DrawImage BackGround,0,0

Color 0,0,160

Rect 250,100,300,400

AWLineY = 207 + (MNUAuswahl - 1) * 150

Color 0,255,0

Line 275,AWLineY,525,AWLineY

Color 255,255,255

Text 400,200," - - - Spiel starten - - - ",1,0
Text 400,350," - - - Beenden - - - ",1,0

Flip

Cls

If KeyHit(1) Then End

If KeyHit(200) Then MNUAuswahl = MNUAuswahl - 1
If KeyHit(208) Then MNUAuswahl = MNUAuswahl + 1

If MNUAuswahl < 1 Then MNUAuswahl = 2
If MNUAuswahl > 2 Then MNUAuswahl = 1


Until KeyHit(28)


If MNUAuswahl = Ende Then End


For K = Each Kugel
   Delete K
Next

For S = Each Stein
   Delete S
Next

PlayerX = 355
PlayerY = 580
PlayerSpeed = 4

GameOver = 0


K = New Kugel
K\X = 390
K\Y = 290
K\Speed# = 1.8
If Rand(1,2) = 1 Then K\Winkel = Rand(30,70) + 180 : Else K\Winkel = Rand(90,150) + 180
K\Image = CreateImage(10,10)
SetBuffer ImageBuffer(K\Image)
   Color 200,200,200
   Oval 0,0,10,10
   Color 150,150,150
   Oval 0,0,10,10,0
   Color 170,170,170
   Oval 1,1,8,8,0
   
SetBuffer BackBuffer()

ScaleImage K\Image,2,2

For X = 0 To 760 Step 40
   For Y = 0 To 100 Step 20
      S = New Stein
      S\X = X
      S\Y = Y
      S\Image = CreateImage(20,10)
      SetBuffer ImageBuffer(S\Image)
         Farbe = Rand(1,4)
         If Farbe = 1 Then Color 0,0,200
         If Farbe = 2 Then Color 0,200,0
         If Farbe = 3 Then Color 200,0,0
         If Farbe = 4 Then Color 200,200,0
         Rect 1,1,50,50,0
         If Farbe = 1 Then Color 0,0,170
         If Farbe = 2 Then Color 0,170,0
         If Farbe = 3 Then Color 170,0,0
         If Farbe = 4 Then Color 170,170,0
         Rect 0,0,20,10,0
         If Farbe = 1 Then Color 0,0,230
         If Farbe = 2 Then Color 0,230,0
         If Farbe = 3 Then Color 230,0,0
         If Farbe = 4 Then Color 230,230,0
         Rect 2,2,17,7,1
      
      SetBuffer BackBuffer()
      
      ScaleImage S\Image,2,2
   Next
Next


Timer1 = MilliSecs()
Timer2 = MilliSecs()


Repeat

DrawAll
MoveAll
Controls
DetectCollisions
Timer

Flip
Cls

Until KeyHit(1) Or GameOver = 1

Until KeyHit(1)



End



Function DrawAll()

DrawImage BackGround,0,0

DrawImage PlayerImage, PlayerX, PlayerY

For s = Each stein
   DrawImage S\Image, S\X, S\Y
Next

For k = Each kugel
   DrawImage K\Image, k\X, k\Y
Next

End Function


Function MoveAll()

For k = Each kugel
   k\x = k\x + Cos(k\winkel) * k\speed
   k\y = k\y - Sin(k\winkel) * k\speed
   
   If k\winkel >= 360 Then k\winkel = k\winkel - 360
   If k\winkel <= -360 Then k\winkel = k\winkel + 360
Next

End Function


Function Controls()

If KeyDown(203) Then playerX = playerX - playerSpeed
If KeyDown(205) Then playerX = playerX + playerSpeed

End Function


Function DetectCollisions()

For k = Each kugel
   If ImagesCollide(k\image,k\x,k\y,0,playerImage,playerX,playerY,0) Then
      k\winkel = k\winkel * (-1)   
      k\speed# = k\speed# + .05
   End If
   
   For s = Each stein
      If ImagesCollide(k\image,k\x,k\y,0,s\image,s\x,s\y,0) Then
         If k\y <= s\y + 20 Or k\y >= s\y - 20 Then
            k\winkel = k\winkel * (-1)
            Goto marke1
         ElseIf k\x <= s\x + 40 Or k\x >= s\y - 20 Then
            k\winkel = k\winkel + (90 - k\winkel) * 2
         End If
         
         .marke1
         
         k\speed = k\speed + .05
         Delete s
      End If
   Next
   
   If k\x <= 0 Then k\winkel = k\winkel + (90 - k\winkel) * 2
   If k\x >= 780 Then k\winkel = k\winkel + (90 - k\winkel) * 2
   If k\y <= 0 Then k\winkel = k\winkel * (-1)
   If k\y >= 600 Then gameover = 1
Next


If playerX <= 0 Then playerX = playerX + playerSpeed
If playerX >= 710 Then playerX = playerX - playerSpeed

End Function


Function Timer()

If MilliSecs() >= Timer + 10000 Then

   For k = Each kugel
      k\winkel = k\winkel + Rand(150)
   Next
   
   Timer = MilliSecs()

End If

End Function


Viel Spaß beim Spielen Smile

MfG,
sheldon

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Okt 16, 2008 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist ja nicht schlecht. Es gibt aber noch ein paar Dinge die ich gerne kritisieren würde:

- Die Winkeländerung sollte nicht genau nach 10 Sekunden passieren, sondern von mir aus, nach 10 Sekunden und nach einer Steinkollision, damit ein anfliegender Ball nicht kurz vor dem Abschlagen seine Richtung ändert.

- Man sollte den Abprallwinkel auch abhängig vom Auftreffpunkt des Schlägers machen.

- Einmal hatte ich ein so flachen Abprallwinkel, dass der Ball einmal hin und ker gesprungen ist, und dabei lediglich etwa 1,5 Ballhöhen Höhe erreichte. Gleich danach hatte ich ein absolut senkrechten Ballverlauf am rechten Bildschirmrand. Anscheinend bereits außerhalb der Bildschirmgrenze, da der Ball auch nach mehreren 10 Sekundentakten da nicht mehr raus wollte.

- Es kommt vor, dass der Ball manchmal mehrere Steine in der Reihe abschlägt. Da müsste also die Kollisionskontrolle noch etwas optimiert werden.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

sheldon

BeitragDo, Okt 16, 2008 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
- Die Winkeländerung sollte nicht genau nach 10 Sekunden passieren, sondern von mir aus, nach 10 Sekunden und nach einer Steinkollision, damit ein anfliegender Ball nicht kurz vor dem Abschlagen seine Richtung ändert.


Wenn der Ball einen ziemlich flachen Winkel hat, dann braucht das ja ewig.


Zitat:
- Man sollte den Abprallwinkel auch abhängig vom Auftreffpunkt des Schlägers machen.


Und wie? Je weiter links, desto flacher, je weiter rechts, desto steiler? Oder wie meinst du ?


Ansonsten werde ich mal schauen, wie ich es noch verbessern kann Wink

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group