In 1989 there was this (Amiga) game called Pang where you had to pop balls that were bouncing around the screen. You controlled a character that could shoot up ropes and when it hit a ball the ball would split in two smaller balls. Once the balls were really small they would dissapear when hit.
Here is a basic version of the game. Paste the code into Monkey and run it to see it. (resolution 640*480 default)
Code below :
Import mojo
Class ball
Field x:Float
Field y:Float
Field radius:Float = 32
Field ballbounce:Float
Field direction:String
Field incy:Float=0
Field delete:Bool=False
Method New(_x:Int,_y:Int,_direction:String,_radius:Int,_ballbounce:Float)
x = _x
y = _y
radius = _radius
ballbounce = _ballbounce
direction = _direction
End Method
Method update()
If incy >= 0 Then
If incy < Abs(ballbounce) Then incy+=.1
For Local i=0 Until incy
y+=0.5
If y+radius > 288 Then incy=ballbounce
Next
End If
If incy < 0 Then
incy+=.1
For Local i=0 Until Abs(incy)
y-=0.5
Next
End If
If direction = "left"
x-=1
If x-radius<=0 Then direction="right"
Else
x+=1
If x+radius>=640 Then direction="left"
End If
For Local i:=Eachin r
If circlerectcollide(x,y,radius,i.x,i.y-i.height,i.width,i.height) = True
r.Remove i
delete = True
Select radius
Case 32
b.AddLast(New ball(x,y,"left",20,-6))
b.AddLast(New ball(x+20,y,"right",20,-6))
Case 20
b.AddLast(New ball(x,y,"left",10,-5))
b.AddLast(New ball(x+10,y,"right",10,-5))
Case 10
b.AddLast(New ball(x,y,"left",6,-4))
b.AddLast(New ball(x+6,y,"right",6,-4))
End Select
End If
Next
For Local i:=Eachin b
If i.delete = True Then
b.Remove i
End If
Next
End Method
Method draw()
SetColor 255,0,0
DrawCircle x,y,radius
End Method
End Class
Class rope
Field x:Float
Field y:Float
Field height:Int
Field width
Field incy:Float=5
Field state:String="Nothing"
Method New(_x:Int,_y:Int)
x = _x
y = _y
state="expanding"
height=0
width=8
End Method
Method draw()
SetColor 255,255,0
DrawRect x,y-height,width,height
End Method
Method update()
Select state
Case "expanding"
For Local i=0 Until incy
height+=1
If y-height < 0 Then
state = "remove"
Exit
End If
Next
Case "remove"
For Local i:=Eachin r
If i.state = "remove" Then r.Remove i
Next
End Select
End Method
End Class
Class player
Field x:Float = 640/2
Field y:Float = 480/2
Field width:Int = 32
Field height:Int = 48
Field wait:Bool=False
Method update()
If KeyDown(KEY_RIGHT)
For Local i=0 Until 3
If x+width < 640
x+=1
End If
Next
End If
If KeyDown(KEY_LEFT)
For Local i=0 Until 3
If x > 0
x-=1
End If
Next
End If
If KeyHit(KEY_SPACE)
r.AddFirst(New rope(x+12,y+48))
End If
End Method
Method draw()
SetColor 255,255,255
DrawRect x,y,width,height
End Method
End Class
Global r:List<rope> = New List<rope>
Global b:List<ball> = New List<ball>
Global p:player = New player
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(60)
b.AddFirst(New ball(100,100,"left",32,-8))
End Method
Method OnUpdate()
For Local i:=Eachin r
i.update
Next
For Local i:=Eachin b
i.update
Next
If b.IsEmpty() = True Then
b.AddLast(New ball(100,100,"left",32,-8))
End If
p.update
End Method
Method OnRender()
Cls 0,0,0
SetColor 255,255,255
For Local i:=Eachin b
i.draw
Next
For Local i:=Eachin r
i.draw
Next
SetColor 255,255,255
DrawText "Use cursor left/right to move, space to shoot rope.",0,0
DrawRect 0,288,640,480-288
p.draw
End Method
End Class
Function circlerectcollide:Bool(cx:Int,cy:Int,cr:Int, rx:Int,ry:Int,rw:Int,rh:Int)
Local closestx:Float = Clamp(cx, rx, rx+rw)
Local closesty:Float = Clamp(cy, ry, ry+rh)
Local distancex :Float = cx - closestx
Local distancey:Float = cy - closesty
Local distancesquared:Float = (distancex * distancex) + (distancey * distancey)
Return distancesquared < (cr * cr)
End Function
Function Main()
New MyGame()
End Function
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.