' hold the left mouse button on the screen to draw particle flames on the screen.
'#Flash
Import mojo
Global screenwidth:Int=640
Global screenheight:Int=480
Global tilewidth:Int=32
Global tileheight:Int=32
Class trail
Field x1:Float,y1:Float
Field x2:Float,y2:Float
Field timeout:Int
Field maxtimeout:Float=70
Field alpha:Float=1
Field deleteme:Bool=False
Method New(x1:Float,y1:Float,x2:Float,y2:Float)
Self.x1 = x1
Self.y1 = y1
Self.x2 = x2
Self.y2 = y2
timeout = maxtimeout
End Method
Method update()
timeout -= 1
If timeout<0
deleteme = True
End If
' update the trail with position of ship
x1 -= Cos(myplayer.ang)*myplayer.thrust
y1 -= Sin(myplayer.ang)*myplayer.thrust
x2 -= Cos(myplayer.ang)*myplayer.thrust
y2 -= Sin(myplayer.ang)*myplayer.thrust
End Method
Method draw()
alpha = (1.0/maxtimeout)*timeout
SetAlpha alpha
SetColor 255,255,255
DrawLine x1,y1,x2,y2
SetAlpha 1
End Method
End Class
Class lineeffect
Field x1:Int=screenwidth/2
Field y1:Int=screenheight/2
Field x2:Int=screenwidth/2
Field y2:Int=screenheight/2
Field deleteme:Bool=False
Method New()
End Method
Method update()
x1=x1-15
y1=y1-15
x2=x2+15
y2=y2+15
If x1<-20 Then deleteme=True
End Method
Method draw()
SetAlpha .3
SetColor 255,255,255
DrawRect x1,y1,x2-x1,10
DrawRect x1,y1,10,y2-y1
DrawRect x1,y2,x2-x1,10
DrawRect x2,y1,10,y2-y1
SetAlpha .2
SetColor 255,255,255
If x1>300 Then DrawRect 0,0,screenwidth,screenheight
SetAlpha 1
End Method
End Class
Class pickups
Field px:Float,py:Float
Field pw:Int=tilewidth/1.5,ph:Int=tileheight/1.5
Field type:String
Field ang:Int
Field deleteme:Bool=False
Field timeout:Int
Field timeoutmax:Int=700+Rnd(700)
Method New(x:Float,y:Float)
px = x
py = y
type="points"
If Rnd()<.7 Then
Select Int(Rnd(0,5))
Case 0
type = "points"
Case 1
type = "circle"
Case 2
type = "backwardsfire"
Case 3
type = "tripplefire"
Case 4
type = "hull"
End Select
End If
End Method
Method update()
' remove is in to long
timeout+=1
If timeout > timeoutmax
deleteme = True
End If
' update the tilemap with the player movement
px -= Cos(myplayer.ang)*myplayer.thrust
py -= Sin(myplayer.ang)*myplayer.thrust
ang+=3
If ang>359 Then ang=0
' collide with player (pickup)
If rectsoverlap(px,py,pw,ph,screenwidth/2,screenheight/2,tilewidth,tileheight)
deleteme = True
mylineeffect.AddLast(New lineeffect())
If type="points" Then myplayer.score+=15
If type="circle"
For Local i=0 To 360 Step 20
mybullet.AddLast(New bullet("player","doubledamage",px,py,i,3.3))
Next
End If
If type="backwardsfire"
myplayer.backwardsfire=True
myplayer.backwardsfiretime=1000
End If
If type="tripplefire"
myplayer.tripplefire=True
myplayer.tripplefiretime=1000
End If
If type="hull"
myplayer.hitpoint+=3
If myplayer.hitpoint > myplayer.maxhitpoint Then myplayer.hitpoint = myplayer.maxhitpoint
End If
Print "Pickup"
End If
'
End Method
Method draw()
Select type
Case "points"
PushMatrix()
Translate px,py
Rotate(-ang)
Translate -px,-py
SetColor 20,20,20
DrawRect px-pw/2,py-ph/2,pw,ph
SetColor 255,255,0
DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2
SetColor 255,255,255
Scale(2,2)
DrawText "P",px/2,py/2,.5,.5
Scale(1,1)
PopMatrix()
Case "circle" ' a circle of lasers
PushMatrix()
Translate px,py
Rotate(-ang)
Translate -px,-py
SetColor 20,20,20
DrawRect px-pw/2,py-ph/2,pw,ph
SetColor 0,0,255
DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2
SetColor 255,255,255
Scale(2,2)
DrawText "C",px/2,py/2,.5,.5
Scale(1,1)
PopMatrix()
Case "backwardsfire" 'can fire backwards
PushMatrix()
Translate px,py
Rotate(-ang)
Translate -px,-py
SetColor 20,20,20
DrawRect px-pw/2,py-ph/2,pw,ph
SetColor 0,255,255
DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2
SetColor 255,255,255
Scale(2,2)
DrawText "B",px/2,py/2,.5,.5
Scale(1,1)
PopMatrix()
Case "tripplefire" 'can fire backwards
PushMatrix()
Translate px,py
Rotate(-ang)
Translate -px,-py
SetColor 20,20,20
DrawRect px-pw/2,py-ph/2,pw,ph
SetColor 250,155,55
DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2
SetColor 255,255,255
Scale(2,2)
DrawText "T",px/2,py/2,.5,.5
Scale(1,1)
PopMatrix()
Case "hull" 'can fire backwards
PushMatrix()
Translate px,py
Rotate(-ang)
Translate -px,-py
SetColor 20,20,20
DrawRect px-pw/2,py-ph/2,pw,ph
SetColor 250,35,10
DrawCircle px+1,py,pw/1.6
SetColor 250,35,10
DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2
SetColor 255,255,255
Scale(2,2)
DrawText "H",px/2,py/2,.5,.5
Scale(1,1)
PopMatrix()
End Select
End Method
Function rectsoverlap:Bool(x1:Int, y1:Int, w1:Int, h1:Int, x2:Int, y2:Int, w2:Int, h2:Int)
If x1 >= (x2 + w2) Or (x1 + w1) <= x2 Then Return False
If y1 >= (y2 + h2) Or (y1 + h1) <= y2 Then Return False
Return True
End Function
End Class
Class enemy
Field type:String
Field ex:Float,ey:Float,er:Int
Field thrust:Float,ang:Int
Field deleteme:Bool=False
Field targetx:Int,targety:Int
Field targetset:Bool=False
Field state:String
Field ishome:Bool=False
Field roaming:Bool=False
Field homex:Int,homey:Int
Field firedelay:Int=20,firetime:Int
Field hitpoint:Int=3
Field maxhitpoint = 3
Field gothit:Bool=False
Field gothittime:Int=20
Field bombarding:Int=False
Field maxthrust:Float=3.3
Field dropfreq:Float=0.4 'lower is less
Field ffhitpoint:Int=2 'force field hitpoints
Method New(x:Int,y:Int)
If Rnd()<.5 Then type="forcefield"
ex=x
ey=y
er=16
hitpoint=maxhitpoint
homex = x
homey = y
thrust=maxthrust
state="roam"
End Method
Method update()
'collision with player bullets
If gothit = True Then gothittime-=1
For Local i:=Eachin mybullet
If i.owner = "player"
If rectsoverlap(i.bx,i.by,i.bradius,i.bradius,
ex-3,ey-3,er+3,er+3)
If type="forcefield"
If i.type = "doubledamage" Then ffhitpoint-=2 Else ffhitpoint-=1
If ffhitpoint<=0 Then type=""
Else
If i.type = "doubledamage" Then hitpoint-=2 Else hitpoint-=1
gothit=True
gothittime=20
If hitpoint<1 Then
Print "Exploded"
If Rnd()<dropfreq Then mypickup.AddLast(New pickups(ex+Cos(ang)*thrust,ey+Sin(ang)*thrust))
myp.AddLast(New particleeffect(ex+Cos(ang)*thrust,ey+Sin(ang)*thrust))
deleteme = True
state=""
myplayer.score+=10
End If
i.deleteme = True
End If
End If
End If
Next
' states of the enemy
Select state
Case "attack"
If Rnd() < .0005
state = "roam"
Print "done attacking"
ishome=False
roaming=False
End If
If Rnd()<.1 Then fireatplayer()
settarget
If Rnd() < .1 bombard()
movein
turn
Case "roam"
If Rnd()<.002
state="attack"
Print "going to attack"
End If
roam
movein
turn
End Select
End Method
Method fireatplayer()
Local d:Int=distance(ex,ey,screenwidth/2,screenheight/2)
firetime+=1
If d<250 And firetime > firedelay
firetime = 0
Local a:Int=getangle(ex,ey,screenwidth/2,screenheight/2)
If myplayer.thrust > .5 Then a=ang
mybullet.AddLast(New bullet("enemy","normal",ex,ey,a,4))
If Rnd()<.1 Then ' sometimes after shooting head back
state = "roam"
Print "done attacking"
thrust = maxthrust
ishome=False
roaming=False
End If
End If
End Method
Method bombard()
Local d:Int = distance(ex,ey,screenwidth/2,screenheight/2)
If bombarding = True And d >220 Then
thrust = maxthrust
bombarding = False
state = "roam"
ishome=False
roaming=False
End If
If myplayer.thrust = 0 And d < 200 And d> 100 And bombarding = False
thrust = 0
fireatplayer()
bombarding = True
End If
If bombarding = True
Local ax:Int=screenwidth/2
Local ay:Int=screenheight/2
If Rnd()<.8 And linerectoverlap(ax,ay,ax+Cos(myplayer.ang)*350,ay+Sin(myplayer.ang)*350,ex,ey,er,er)
Print "scared off"
thrust = maxthrust
bombarding = False
state = "roam"
ishome=False
roaming=False
End If
fireatplayer()
End If
End Method
Method roam()
Local dtohome = distance(ex,ey,homex,homey)
Local dtotarget = distance(ex,ey,targetx,targety)
If dtohome > 300 And ishome = False And roaming=False
ishome=True
targetx = homex
targety = homey
End If
If dtohome < 50 And ishome = True And roaming = False
roaming = True
targetx = homex+Rnd(-100,100)
targety = homey+Rnd(-100,100)
End If
If dtotarget < 50 And roaming = True
targetx = homex+Rnd(-100,100)
targety = homey+Rnd(-100,100)
End If
If dtotarget > 300 And roaming=True
roaming=False
ishome=False
End If
End Method
Method turn()
'turn
Local pangle:Int = getangle(ex,ey,targetx,targety)
If leftangle(ang,pangle) = True Then ang+=3 Else ang-=3
If ang>180 Then ang=-180
If ang<-180 Then ang=180
End Method
Method movein()
'move in
ex -= Cos(myplayer.ang)*myplayer.thrust
ey -= Sin(myplayer.ang)*myplayer.thrust
ex += Cos(ang)*thrust
ey += Sin(ang)*thrust
End Method
Method settarget()
'set target
Local d:Int=distance(ex,ey,screenwidth/2,screenheight/2)
If d > 550
targetx = screenwidth/2
targety = screenheight/2
targetset = False
Else
If targetset = False
targetx = (screenwidth/2)+Rnd(-90,90)
targety = (screenheight/2)+Rnd(-90,90)
targetset = True
End If
End If
If d<80 Then
targetx = (screenwidth/2)+Rnd(-190,190)
targety = (screenheight/2)+Rnd(-190,190)
End If
End Method
Method draw()
SetColor 255,0,0
If gothit = True
If gothittime<0 Then gothit=False
SetColor 255,255,255
End If
DrawCircle ex,ey,er
' draw the powerbar
Local x:Float=ex-er
Local y:Float=ey-er
Local w1:Float=(er*2)-2
Local w2:Float=(er*2)
Local s:Float = w1/maxhitpoint
w1 = s*hitpoint
SetColor 0,0,0
DrawRect x,y,w2,5
If hitpoint < 2
SetColor 255,0,0
Else
SetColor 255,255,0
End If
DrawRect x+2,y+2,w1,3
' draw forcefield
If type="forcefield"
SetColor 55,155,255
SetAlpha .5
DrawCircle ex-2,ey-2,er+12
SetAlpha 1
End If
End Method
Function leftangle:Bool(_angle:Int,_destinationangle:Int)
Local cnt1 = 0
Local a1 = _angle
While a1<>_destinationangle
a1+=1
If a1>180 Then a1=-180
cnt1+=1
Wend
If cnt1<180 Then Return True Else Return False
End Function
Function linerectoverlap:Bool(x1:Int,y1:Int,x2:Int,y2:Int,x3:Int,y3:Int,w:Int,h:Int)
Local a:Int=getangle(x1,y1,x2,y2)
Local ax:Float=x1
Local ay:Float=y1
' Print x2
' Print x1+","+ax+Cos(a)*300+","+x2
Local ex:Bool=False
While ex=False
ax+=Cos(a)*1
ay+=Sin(a)*1
' Print ax+","+ay+","+x2+","+y2
If rectsoverlap(ax-8,ay-8,16,16,x2-8,y2-8,16,16) = True Then ex=True
If rectsoverlap(x3,y3,w,h,ax-6,ay-6,12,12) Then
Return True
End If
Wend
Return False
End Function
Function getangle:Int(x1:Int,y1:Int,x2:Int,y2:Int)
Local dx = x2 - x1
Local dy = y2 - y1
Return ATan2(dy,dx)+360 Mod 360
End Function
Function distance:Int(x1:Int,y1:Int,x2:Int,y2:Int)
Return Abs(x2-x1)+Abs(y2-y1)
End Function
Function rectsoverlap:Bool(x1:Int, y1:Int, w1:Int, h1:Int, x2:Int, y2:Int, w2:Int, h2:Int)
If x1 >= (x2 + w2) Or (x1 + w1) <= x2 Then Return False
If y1 >= (y2 + h2) Or (y1 + h1) <= y2 Then Return False
Return True
End Function
End Class
Class bullet
Field deleteme:Bool=False
Field bx:Float,by:Float,bradius:Float
Field ang:Int,thrust:Float
Field time:Int,timeout:Int=100
Field alpha:Float
Field owner:String
Field type:String
Method New(owner:String,type:String,x:Int,y:Int,angle:Int,thrust:Float)
Self.type = type
Self.owner = owner
Self.ang = angle
Self.bx = x
Self.by = y
Self.thrust = thrust
bradius = 6
thrust = 4
End Method
Method update()
time+=1
bx += Cos(ang)*thrust
by += Sin(ang)*thrust
If time > timeout Then deleteme = True
alpha = 1-(.5/Float(timeout))*time
' update the tilemap with the player movement
bx -= Cos(myplayer.ang)*myplayer.thrust
by -= Sin(myplayer.ang)*myplayer.thrust
End Method
Method draw()
SetAlpha alpha
SetColor 0,0,0
DrawCircle bx-1,by,bradius+1
Select owner
Case "player"
SetColor 255,0,255
Case "enemy"
SetColor 255,255,0
End Select
DrawCircle bx,by,bradius
Select owner
Case "player"
SetColor 255,190,255
Case "enemy"
SetColor 255,255,190
End Select
DrawCircle (bx-bradius)+4,(by-bradius)+4,bradius/2
SetAlpha 1
End Method
End Class
Class player
Field score:Int
Field ang:Float
Field thrust:Float
Field turninc:Float
Field turnincmax:Float=3
Field turnincmin:Float=-3
Field maxthrust:Float = 4
Field firedelay:Int=5
Field firetime:Int
Field backwardsfire:Bool=False
Field backwardsfiretime:Int
Field tripplefire:Bool=False
Field tripplefiretime:Int
Field ship:Float[]=[ -5.0,-5.0,
5.0,0.0,
-5.0,5.0]
Field trailtime:Int=10
Field hitpoint = 10
Field maxhitpoint=10
Method New()
End Method
Method update()
'shoot
firetime+=1
If KeyDown(KEY_SPACE) And firetime > firedelay
firetime = 0
mybullet.AddFirst(New bullet("player","Normal",screenwidth/2,screenheight/2,ang,6))
'should we fire backwards to
If backwardsfire = True
Local a:Int=ang
For Local i=0 Until 180
a+=1
If a>359 Then a=0
Next
mybullet.AddFirst(New bullet("player","Normal",screenwidth/2,screenheight/2,a,6))
End If
If tripplefire = True
Local a:Int=ang
For Local i=0 Until 25
a+=1
If a>359 Then a=0
Next
mybullet.AddFirst(New bullet("player","Normal",screenwidth/2,screenheight/2,a,6))
a=ang
For Local i=0 Until 25
a-=1
If a<0 Then a=360
Next
mybullet.AddFirst(New bullet("player","Normal",screenwidth/2,screenheight/2,a,6))
End If
End If
'turn
If KeyDown(KEY_LEFT) Then turninc-=.2
If KeyDown(KEY_RIGHT) Then turninc+=.2
turninc = Clamp(turninc,turnincmin,turnincmax)
If turninc > .1 Then turninc -= .1
If turninc < -.1 Then turninc += .1
If turninc >-.1 And turninc <.1 Then turninc=0
ang+=turninc
If ang>359 Then ang=0
If ang<0 Then ang=359
'thrust
If KeyDown(KEY_UP) Then thrust += .1
If KeyDown(KEY_DOWN) Then thrust -= .1
If thrust < 0 Then thrust = 0
If thrust > maxthrust Then thrust = maxthrust
' Here the trail is created
trailtime-=1
If trailtime<0 Then
Local x:Int=screenwidth/2
Local y:Int=screenheight/2
mytrail.AddLast(New trail(x,y,x+Cos(ang)*12,y+Sin(ang)*12))
trailtime=10
End If
' count down backwards fire
backwardsfiretime-=1
If backwardsfiretime<0 Then
backwardsfire=False
End If
' count down trippe fire
tripplefiretime-=1
If tripplefiretime<0 Then
tripplefire=False
End If
'collision detection with the bullets
For Local i:=Eachin mybullet
If i.owner="enemy"
If rectsoverlap(i.bx,i.by,i.bradius,i.bradius,(screenwidth/2)-3,(screenheight/2)-3,tilewidth-6,tileheight-6)
i.deleteme = True
hitpoint -= 1
End If
End If
Next
End Method
Method draw()
PushMatrix()
Translate screenwidth/2,screenheight/2
Rotate(-ang)
Scale(4,4)
SetColor 255,255,255
DrawPoly(ship)
Translate 0,0
PopMatrix()
SetColor 255,0,0
DrawLine screenwidth/2,
screenheight/2,
screenwidth/2+Cos(ang)*(tilewidth*2),
screenheight/2+Sin(ang)*(tileheight*2)
End Method
Function rectsoverlap:Bool(x1:Int, y1:Int, w1:Int, h1:Int, x2:Int, y2:Int, w2:Int, h2:Int)
If x1 >= (x2 + w2) Or (x1 + w1) <= x2 Then Return False
If y1 >= (y2 + h2) Or (y1 + h1) <= y2 Then Return False
Return True
End Function
End Class
Class map
Field mapx:Float=0
Field mapy:Float=0
Field map:Int[][] = [ [0,0,0,1,0,1,0,1,0,1,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,1,0,1,0,1,0,0,0,1,0,1,0,1,0],
[0,1,0,0,0,0,1,1,1,0,0,0,0,1,0],
[0,1,0,1,0,0,1,0,1,0,0,1,0,1,0],
[0,1,0,0,0,0,1,1,1,0,0,0,0,1,0],
[0,1,0,1,0,1,0,0,0,1,0,1,0,1,0],
[0,1,0,0,1,0,0,0,0,0,1,0,0,1,0],
[0,0,0,1,0,1,0,1,0,1,0,1,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
Field starimage:Image
Field starimagew:Int=screenwidth*2
Field starimageh:Int=screenheight*2
Field starimagepixels:Int[]
Method New()
' create the background starfield
starimagepixels = New Int[starimagew*starimageh]
starimage = CreateImage(starimagew,starimageh)
createstarimage()
End Method
Method update()
' update the tilemap with the player movement
mymap.mapx -= Cos(myplayer.ang)*myplayer.thrust
mymap.mapy -= Sin(myplayer.ang)*myplayer.thrust
End Method
Method createstarimage()
For Local i=0 Until starimagew*starimageh
starimagepixels[i] = argb(0,0,0)
Next
Local s:Float=255.0/(starimageh/2)
Local cnt:Float=0
For Local y = starimageh To starimageh/2 Step -1
drawr(0,y,starimagew,1,argb(0,0,255-s*cnt))
cnt+=1
Next
'
For Local i=0 Until 1000
Local c:Int=Rnd(10,255)
Local pos:Int=Rnd(starimagew*starimageh)
starimagepixels[pos] = argb(c,c,c)
If Rnd()<.2 Then starimagepixels[pos-1] = argb(c,c,c)
Next
' create the planet in the background
Local x:Int=screenwidth-90
Local y:Int=screenheight-90
drawo(x,y,200,argb(40,20,20))
drawo(x+10,y+10,195,argb(0,0,0))
starimage.WritePixels(starimagepixels, 0, 0, starimagew, starimageh, 0)
End Method
Method draw()
SetAlpha 1
DrawImage starimage,(-screenwidth/2)+(mapx/15),(-screenheight/2)+(mapy/15)
For Local y=0 Until 10
For Local x=0 Until 15
If map[y][x] = 1
Local x2:Int=x*tilewidth+mapx
Local y2:Int=y*tileheight+mapy
SetColor 155,155,155
DrawRect x2,
y2,
tilewidth,
tileheight
SetColor 255,255,255
DrawLine x2+2,y2+2,x2+tilewidth-4,y2+2
DrawLine x2+2,y2+2,x2+2,y2+tileheight-4
SetColor 55,55,55
DrawLine x2+4,y2+tileheight-4,x2+tilewidth-8,y2+tileheight-4
DrawLine x2+tilewidth-4,y2+tileheight-4,x2+tilewidth-4,y2+4
End If
Next
Next
'drawminimap
'
Local s:Float=255/9
For Local x=0 Until 9
Local c:Float=Float(x)*s
SetColor c,c,c
DrawLine (screenwidth-109)+x,0,(screenwidth-109)+x,103+x
Next
For Local y=0 To 9
Local c:Float=Float(y)*s
SetColor c,c,c
DrawLine (screenwidth-109)+y,109-y,screenwidth,109-y
Next
'
SetColor 10,10,10
DrawRect screenwidth-100,1,100,100
'tilecenter
SetColor 100,100,100
Local x:Float = screenwidth-100
Local y:Float = 1
x += (100.0/5000)*mymap.mapx
y += (100.0/5000)*mymap.mapy
x+=55
y+=55
' Print x
DrawRect x,y,10,10
' enemies/drones
SetColor 255,255,0
For Local i:=Eachin myenemy
Local x:Float=screenwidth-100
Local y:Float=1
Local sx:Float=100.0/5000
Local sy:Float=100.0/5000
x+=(sx*i.ex)+50
y+=(sy*i.ey)+50
DrawRect x,y,2,2
Next
'player position
SetColor 255,255,50
SetAlpha .4
DrawCircle screenwidth-50+10,50+10,20
SetAlpha 1
End Method
' makes a noisy oval
Method drawo(x1,y1,radius,col)
For Local y2=-radius To radius
For Local x2=-radius To radius
If (y2*y2+x2*x2) <= radius*radius+radius*0.8
Local x3 = x2+x1
Local y3 = y2+y1
Local pc = y3*starimagew+x3
If pc>=0 And pc < starimagew*starimageh
Local r:Int=getred(col)
Local g:Int=getgreen(col)
Local b:Int=getblue(col)
Local rs:Float=Float(255)/9
Local gs:Float=Float(255)/9
Local bs:Float=Float(255)/9
Local r2:Int = r+Rnd(-rs,rs)
Local g2:Int = r+Rnd(-gs,gs)
Local b2:Int = r+Rnd(-bs,bs)
r2 = Clamp(r2,0,255)
g2 = Clamp(g2,0,255)
b2 = Clamp(b2,0,255)
Local mc:Int=(r2+g2+b2)/3
r2=(r2/2)+r/2
g2=(g2/2)+g/2
b2=(b2/2)+b/2
Local col2:Int=argb(r2,g2,b2)
starimagepixels[pc] = col2
End If
End If
Next
Next
End Method
Method drawr(x1,y1,w1,h1,col)
For Local y2=y1 Until y1+h1
For Local x2=x1 Until x1+w1
Local pc = y2*starimagew+x2
If pc >= 0 And pc < starimagew*starimageh
starimagepixels[pc] = col
End If
Next
Next
End Method
Function argb:Int(r:Int, g:Int, b:Int ,alpha:Int=255)
Return (alpha Shl 24) | (r Shl 16) | (g Shl 8) | b
End Function
Function getred:Int(rgba:Int)
Return((rgba Shr 16) & $FF)
End Function
Function getgreen:Int(rgba:Int)
Return((rgba Shr 8) & $FF)
End Function
Function getblue:Int(rgba:Int)
Return(rgba & $FF)
End Function
Function getalpha:Int(rgba:Int)
Return ((rgba Shr 24) & $FF)
End Function
End Class
Class particle
Field x:Float
Field y:Float
Field incx:Float
Field incy:Float
Field modincx:Float
Field modincy:Float
Field sx:Float
Field sy:Float
Field sxinc:Float
Field syinc:Float
Field timeout:Float
Field time:Float
Field alpha:Float
Field deleteme:Bool=False
Method New(x:Int,y:Int,angle:Int)
Self.x = x
Self.y = y
incx = Cos(angle+Rnd(-5,5))
incy = Sin(angle+Rnd(-5,5))
timeout = 50+Rnd(20)
alpha = 1
modincx = (Cos(angle+Rnd(-5,5)))/100
modincy = (Sin(angle+Rnd(-5,5)))/100
Local sc:Float=Rnd(0.5,1)
sx = sc
sy = sc
sxinc = Rnd()/timeout
syinc = Rnd()/timeout
End Method
Method update()
x -= Cos(myplayer.ang)*myplayer.thrust
y -= Sin(myplayer.ang)*myplayer.thrust
End Method
End Class
Class particleeffect
Field sw:Int,sh:Int
Field p:List<particle> = New List<particle>
Field image:Image
Field iw:Int=32
Field ih:Int=32
Field pixels:Int[]
Field angle:Int
Field x:Float,y:Float
Field deleteme:Bool=False
Field timeout:Int=50
Method New(x:Int,y:Int)
Self.x = x
Self.y = y
Self.sw = screenwidth
Self.sh = screenheight
pixels = New Int[iw*ih]
image = CreateImage(iw,ih,image.MidHandle)
makeimage()
p.AddFirst(New particle(x,y,Rnd(360)))
End Method
Method update()
timeout-=1
If timeout < 0 Then deleteme = True
If Rnd() < 0.4
p.AddFirst(New particle(x,y,Rnd(360)))
End If
'update the particles with the map movement(player)
x -= Cos(myplayer.ang)*myplayer.thrust
y -= Sin(myplayer.ang)*myplayer.thrust
For Local i:=Eachin p
'update the particles with the map movement(player)
i.x -= Cos(myplayer.ang)*myplayer.thrust
i.y -= Sin(myplayer.ang)*myplayer.thrust
i.x += i.incx
i.y += i.incy
i.incx += i.modincx
i.incy += i.modincy
i.alpha -= 1/i.timeout
i.time += 1
i.sx += i.sxinc
i.sy += i.syinc
If i.time > i.timeout Then i.deleteme = True
Next
For Local i:=Eachin p
If i.deleteme = True Then p.Remove(i)
Next
End Method
Method makeimage()
For Local i=0 To iw
Local c:Int = 0+((255/iw)*i)
drawo(iw/2,ih/2,(iw/2)-(i),argb(c,c,c,255))
Next
image.WritePixels(pixels, 0, 0, iw, ih, 0)
End Method
Method drawo(x1,y1,radius:Float,col)
For Local y2=-radius To radius
For Local x2=-radius To radius
If (y2*y2+x2*x2) <= radius*radius+radius*0.8
Local x3 = x2+x1
Local y3 = y2+y1
Local pc = y3*iw+x3
If pc>=0 And pc < iw*ih
pixels[pc] = col
End If
End If
Next
Next
End Method
Method draw()
SetBlend AdditiveBlend
SetColor 255,50,0
For Local i:=Eachin p
SetAlpha i.alpha
Local sc:Float=(1/i.timeout)*i.time
DrawImage(image,i.x,i.y,1,i.sx,i.sy)
Next
SetAlpha 1
SetBlend AlphaBlend
End Method
Function argb:Int(r:Int, g:Int, b:Int ,alpha:Int=255)
Return (alpha Shl 24) | (r Shl 16) | (g Shl 8) | b
End Function
Function getred:Int(rgba:Int)
Return((rgba Shr 16) & $FF)
End Function
Function getgreen:Int(rgba:Int)
Return((rgba Shr 8) & $FF)
End Function
Function getblue:Int(rgba:Int)
Return(rgba & $FF)
End Function
Function getalpha:Int(rgba:Int)
Return ((rgba Shr 24) & $FF)
End Function
End Class
Global myplayer:player
Global mymap:map
Global mybullet:List<bullet> = New List<bullet>
Global myenemy:List<enemy> = New List<enemy>
Global myp:List<particleeffect> = New List<particleeffect>
Global mypickup:List<pickups> = New List<pickups>
Global mylineeffect:List<lineeffect> = New List<lineeffect>
Global mytrail:List<trail> = New List<trail>
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(60)
myplayer = New player()
mymap = New map()
For Local i=0 Until 5
myenemy.AddLast(New enemy(Rnd(-screenwidth*2,screenwidth*2),Rnd(-screenheight*2,screenheight*2)))
Next
For Local i=0 Until 3
mypickup.AddLast(New pickups(Rnd(300),Rnd(300)))
Next
For Local i=0 Until 10
mypickup.AddLast(New pickups(screenwidth/2+Rnd(-50,50),screenheight/2+Rnd(-50,50)))
Next
End Method
Method OnUpdate()
myplayer.update()
mymap.update()
If MouseDown(MOUSE_LEFT)
myp.AddLast(New particleeffect(MouseX(),MouseY()))
End If
'update the trail
For Local i:=Eachin mytrail
i.update
Next
'update the trail
For Local i:=Eachin mytrail
If i.deleteme = True Then mytrail.Remove(i)
Next
'update the line effects
For Local i:=Eachin mylineeffect
i.update
Next
For Local i:=Eachin mylineeffect
If i.deleteme = True Then mylineeffect.Remove(i)
Next
' update the pickpups
For Local i:=Eachin mypickup
i.update()
Next
For Local i:=Eachin mypickup
If i.deleteme = True Then mypickup.Remove(i)
Next
' update the particles
For Local i:=Eachin myp
i.update()
Next
For Local i:=Eachin myp
If i.deleteme = True Then myp.Remove(i)
Next
For Local i:=Eachin mybullet
i.update
Next
For Local i:=Eachin mybullet
If i.deleteme = True Then mybullet.Remove(i)
Next
For Local i:=Eachin myenemy
i.update
Next
For Local i:=Eachin myenemy
If i.deleteme = True Then myenemy.Remove(i)
Next
' temp add new enemies if all have died
Local cnt:Int=0
For Local i:=Eachin myenemy
cnt+=1
Next
If cnt=0 Then
For Local i=0 Until Rnd(5,8)
myenemy.AddLast(New enemy(Rnd(-screenwidth*2,screenwidth*2),Rnd(-screenheight*2,screenheight*2)))
Next
For Local i=0 Until 10
mypickup.AddLast(New pickups(mymap.mapx+Rnd(300),mymap.mapy+Rnd(300)))
Next
Print "Added new wave of enemies"
End If
End Method
Method OnRender()
'Cls 0,0,0
mymap.draw()
'draw the pickups
For Local i:=Eachin mypickup
i.draw
Next
For Local i:=Eachin myenemy
i.draw
Next
For Local i:=Eachin mybullet
i.draw
Next
'update the particles
For Local i:=Eachin myp
i.draw()
Next
'draw the trail
For Local i:=Eachin mytrail
i.draw
Next
myplayer.draw()
'draw the line effects
For Local i:=Eachin mylineeffect
i.draw
Next
SetColor 255,255,255
DrawText "Cursor Left/Right/Up/Down/Space",0,0
DrawText "Score : "+myplayer.score,0,screenheight-15
DrawText "Hull : "+myplayer.hitpoint,200,screenheight-15
End Method
End Class
Function Main()
New MyGame()
End Function
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.