Hmm okay, don't see how that could help but alright. Careful or you might go blind from my n00b coding:
Strict
(whole lot of incbin's removed here, to save space)
Graphics 800,600,0
SetClsColor 100,100,100
SetMaskColor 255,255,255'White
AutoMidHandle True
(more image loading removed)
Include "powerup.bmx"
Include "particles.bmx"
Type obj
Field x#, y#
Field speed# = 0.1
Field height#
Field width#
EndType
Type tball Extends obj 'note: ball image must be 100x100 pixels
Field oldx# = 0, oldy# = 0
Field offsetx#
Field dir# = 0
Field radius# = 10
Field oldspeed# = 0
Field sticky = 0
Function newball(radius)
Local ball:tball = New tball
ball.radius = radius
balllist.addlast(ball)
EndFunction
Method moveball()
oldx# = x
oldy# = y
x#:+ Sin(dir)*speed*time
y#:+ Cos(dir)*speed*time
EndMethod
Method collide()
If x <= radius-3 Or x >= 646-radius Then x = oldx ; dir = (180 - dir) + 180 ' left wall and right wall collide check
If y <= radius-3 Then y = oldy ; dir = 180 - dir ' top wall and bottom wall collide check
Local paddleh# = paddle.height/2
If y+radius >= paddle.y - paddleh ' check if ball is below paddle y
Local paddlew# = paddle.width/2
If x+radius > paddle.x-paddlew And x-radius < paddle.x+paddlew Then 'check if ball is between paddle in x
If paddle.sticky = 1
If sticky = 0 Then ' set the ball as sticky if it isn't, making it stop etc.
sticky = 1
oldspeed = speed
speed = 0
offsetx = x-paddle.x
If x > paddle.x Then dir = 180 - (x - paddle.x)/2
If x < paddle.x Then dir = 180 + (paddle.x - x)/2
EndIf
x = MouseX() + offsetx
y = paddle.y - paddleh - radius 'fix the ball height if it's below the paddle
If MouseHit(1) Then For Local ball:tball = EachIn balllist 'make sure we release all balls from paddle when mousehit
If ball.sticky = 1 Then
If ball.speed = 0 Then ball.speed = ball.oldspeed ; ball.oldspeed = 0
ball.sticky = 0
EndIf
Next
EndIf
Else
If x > paddle.x Then dir = 180 - (x - paddle.x)/2
If x < paddle.x Then dir = 180 + (paddle.x - x)/2
EndIf
Return
EndIf
EndIf
If y >= 600 Then die()
EndMethod
Method draw()
Local ratio# = radius / 100 * 2
SetScale ratio,ratio
DrawImage(ballimg, x, y)
SetScale 1,1
EndMethod
Method die()
balllist.remove(Self)
EndMethod
EndType
Type TBrick Extends obj
Field strength = 1
Field r,g,b
Field powerup = 0
Field number# = 0
Function create(x=200,y=200,h=20,w=70,r=200,g=200,b=255,str=1,powerup=0)
Local newbrick:tbrick = New tbrick
newbrick.x = x
newbrick.y = y
newbrick.height = h
newbrick.width = w
newbrick.r = r
newbrick.g = g
newbrick.b = b
If randompowerups = True
Local random = Rand(1,5)
If random = 1 Then newbrick.powerup = getrandomeffectnumber()
EndIf
bricklist.addlast(newbrick)
EndFunction
Method collide()
For Local ball:tball = EachIn balllist
Local brickw = width / 2
If ball.x# + ball.radius => x# - brickw Then
If ball.x# - ball.radius =< x# + brickw Then
Local brickh = height / 2
If ball.y# + ball.radius => y# - brickh Then
If ball.y# - ball.radius =< y# + brickh Then
If ball.oldy < y - brickh Then ball.dir = 180 - ball.dir ; ball.y = ball.oldy ; die() ; Return
If ball.oldy > y + brickh Then ball.dir = 180 - ball.dir ; ball.y = ball.oldy ; die() ; Return
If ball.oldx < x - brickw Then ball.dir = 360 - ball.dir ; ball.x = ball.oldx ; die() ; Return
If ball.oldx > x + brickw Then ball.dir = 360 - ball.dir ; ball.x = ball.oldx ; die() ; Return
EndIf
EndIf
EndIf
EndIf
Next
EndMethod
Method draw()
If powerup > 0 Then
r = 255
g = 255
b = 10
EndIf
SetColor r,g,b
DrawImage(brick1img, x, y)
Select strength
Case 1 DrawImage(cracked_3,x,y)
Case 2 DrawImage(cracked_2,x,y)
Case 3 DrawImage(cracked_1,x,y)
EndSelect
EndMethod
Method die()
If strength = 1 And powerup > 0 Then tpowerup.spawn(x,y,powerup)
If strength = 1 Then bricklist.remove(Self) ; 'PlaySound explodesnd ; player1.score:+25
If strength = 1 Then explode(x,y, width/2, height/2,r,g,b)
If strength > 1 Then strength:-1 ; 'PlaySound pop ; player1.score:+10
EndMethod
EndType
Type TPaddle Extends obj
Field width# = 190
Field leftwidth# = 15
Field rightwidth# = 15
Field height# = 17
Field x = 0
Field y = 580
Field sticky = 0
Method move()
x = MouseX()
EndMethod
Method draw()
Local realwidth = width - leftwidth - rightwidth
Local halfwidth = realwidth/2
SetColor 255,255,255
Local MouseX = MouseX()
If MouseX < 15 + halfwidth Then MouseX = 15 + halfwidth
If MouseX > 630 - halfwidth Then MouseX = 630 - halfwidth
MoveMouse MouseX, 550
DrawImage(paddle_leftimg, MouseX-halfwidth-7, 580)
SetScale realwidth,1
DrawImage(paddle_middleimg, MouseX, 580)
SetScale 1,1
DrawImage(paddle_rightimg, MouseX+halfwidth+8, 580)
EndMethod
EndType
Type player
Field lives = 3
Field score = 0
EndType
Type background Extends obj
Method draw()
SetColor 255,255,255
TileImage(tileimg,x,y)
x#:+.4*time
y#:+.5*time
EndMethod
EndType
Global balllist:TList = CreateList()
Global bricklist:TList = CreateList()
Global sparklist:TList = CreateList()
Global state$ = "menu"
Global ball_hold = 1
Global newbackground:background = New background
Global player1:player = New player
Global time# = 1
Global paddle:tpaddle
Repeat
If state = "menu" Then menu()
If state = "started" Then started()
If state = "started" And ListIsEmpty(balllist) Then die()
If state = "started" And ListIsEmpty(bricklist) Then die()
If state = "gameover" Then gameover()
Flip; Cls
' FlushMem -- this did not work with 1.16
Until KeyDown(Key_Escape)
Function die()
If player1.lives = 0 Then state = "gameover" ; Return
player1.lives:-1
tball.newball(10)
ball_hold = 1
EndFunction
Function gameover()
If KeyHit(key_space) state = "menu" ; Return
SetBlend(alphablend)
newbackground.draw()
SetRotation Cos(number)*20
SetScale Cos(number)*1, Cos(Cos(number)*1)*1.2
number:+1
SetColor 0,0,0
SetAlpha 0.1
DrawImage(gameoverimg,400,400)
SetColor 255,255,255
SetAlpha 1
DrawImage(gameoverimg,400,300)
SetRotation 0
SetColor 0,0,0
SetScale 1,1
DrawText "Press SPACE for menu", 200,550
EndFunction
Function menu()
SetBlend(alphablend)
newbackground.draw()
SetAlpha .1
DrawImage(logo_shadowimg, 400, 150)
SetAlpha 1
SetColor 255,255,255
DrawImage(logoimg, 400, 100)
SetColor 0,0,Rand(100,200)
DrawText "Press SPACE to start a new game", 290,300
If KeyHit(key_space) Then newgame()
EndFunction
Function newgame()
tball.newball(10)
paddle = New tpaddle
player1.lives = 3
player1.score = 0
balllist.clear()
bricklist.clear()
poweruplist.clear
debrislist.clear()
Include "level1.bmx"
state = "started"
EndFunction
Function started()
newbackground.draw()
For Local brick:tbrick = EachIn bricklist
brick.collide()
brick.draw()
Next
For Local particle:tparticle = EachIn particlelist
particle.move()
particle.draw()
Next
For Local debris:tdebris = EachIn debrislist
debris.move()
debris.draw()
Next
For Local ball:tball = EachIn balllist
ball.moveball()
ball.collide()
ball.draw()
Next
For Local powerup:tpowerup = EachIn poweruplist
powerup.move()
powerup.collide(paddle.width)
powerup.draw()
Next
paddle.move()
paddle.draw()
drawstatusbar()'' drawvalues()
If ball_hold = 1
ballhold()
Else
If MouseDown(2) Then matrix() Else time = 1 ; SetAlpha 1
If KeyHit(key_e) Then state = "edit"
'If KeyHit(key_down) Then paddle.width:-50
'If KeyHit(key_up) Then paddle.width:+50
If KeyHit(key_down) Then For Local ball:tball = EachIn balllist ; ball.radius:-30 ; Next
If KeyHit(key_up) Then For Local ball:tball = EachIn balllist ; ball.radius:+30 ; Next
If KeyHit(key_x) Then For Local brick:tbrick = EachIn bricklist ; brick.die() ; Next
If KeyHit(key_4) Then tbrick.create(Rand(40,600), Rand(20,700))
If KeyHit(key_5) Then createballs(5, Rand(4,20))
If KeyHit(key_6) Then Include "level1.bmx"
If KeyHit(key_0) Then createballs(100, Rand(1,3))
If KeyHit(key_space) Then
For Local ball:tball = EachIn balllist
If ball.speed <> 0
ball.speed = 0
Else
ball.speed = 5
EndIf
Next
EndIf
EndIf
EndFunction
Function matrix()
DrawText "MATRIX MODE ON",700,580
time = 0.1
EndFunction
Function ballhold()
For Local ball:tball = EachIn balllist
ball.speed = 0
ball.y = MouseY()'550
ball.x = MouseX()
Next
If MouseHit(1) Then launchball()
EndFunction
Function launchball()
ball_hold = 0
For Local ball:tball = EachIn balllist
ball.speed = 6
ball.dir = Rand(135,225)
Next
EndFunction
Function drawstatusbar() SetColor 0,0,0
DrawRect 645,0,5,600
SetColor 201,203,219
DrawRect 650,0,600,800
SetColor 255,255,255
EndFunction
Function drawvalues()
SetColor 0,0,0
DrawText "Number of balls : "+balllist.Count(), 20, 40
DrawText "Number of bricks : "+bricklist.Count(), 20, 20
DrawText "Score: "+player1.score, 660,100
DrawText "Lives: "+player1.lives, 660,120
EndFunction