SuperStrict
Framework brl.GLMax2D
'Framework brl.d3d7Max2D
Import brl.random
Import brl.eventqueue
'------------------------------- set graphics
SetGraphicsDriver GLMax2DDriver()
'SetGraphicsDriver D3D7Max2DDriver()
Global wintitle:String = " *** HAPPY 2010 ***"
AppTitle=(wintitle)
Global scrx:Int = 800'1280
Global scry:Int = 800'800
Graphics(scrx,scry,0,60)
AutoMidHandle(1)
'==============================================================================================
'GENERATING CONTENT
'==============================================================================================
Global background:TImage = CreateImage(scrx,scry,1,FILTEREDIMAGE|DYNAMICIMAGE|MASKEDIMAGE)
Local pixmap:TPixmap = LockImage(background)
For Local x:Float = 0 Until scrx
For Local y:Float = 0 Until scry
Local xx:Float = x-scrx*0.5
Local yy:Float = y-scry*0.3
Local dot:Float = xx*xx+yy*yy
If dot
dot = 1.0- Sqr(dot)/scrx
If dot<0 Then dot= 0
If dot>1.0 Then dot=1
dot:*255
EndIf
Local alpha:Int = (0.2+0.8*(y/scry)^10)*255
WritePixel(pixmap,x,y,Int(dot)|alpha Shl 24)
Next
Next
UnlockImage(background)
Global land_height:Int = 100
Global land:TImage = CreateImage(scrx,land_height,1,FILTEREDIMAGE|DYNAMICIMAGE|MASKEDIMAGE)
pixmap = LockImage(land)
For Local x:Float = 0 Until scrx
For Local y:Float = 0 Until land_height
Local col:Float = 0
Local y_perc:Float = y/land_height
Local alpha:Int = 0
If y>0
col = 0.8+0.2*Sin(x+(land_height-y*y_perc)*Cos(x*y_perc^2))
col:* y_perc
col:*255
alpha=y_perc^2*255
EndIf
WritePixel(pixmap,x,y,Int(alpha) Shl 24|Int(col) Shl 16|Int(col) Shl 8|Int(col))
Next
Next
UnlockImage(land)
Local glowsize:Int = 32
Local glowhalf:Int = glowsize*0.5
Global glow:TImage = CreateImage(glowsize,glowsize,1,FILTEREDIMAGE|DYNAMICIMAGE|MASKEDIMAGE)
pixmap = LockImage(glow)
For Local x:Float = 0 Until glowsize
For Local y:Float = 0 Until glowsize
Local xx:Float = x-glowhalf
Local yy:Float = y-glowhalf
Local dot:Float = xx*xx+yy*yy
If dot
dot = 1.0- Sqr(dot)/glowhalf
dot = dot*0.1+(dot*1.1)^8
If dot<0 Then dot= 0
If dot>1.0 Then dot=1
dot:*255
Else
dot = 255
EndIf
WritePixel(pixmap,x,y,Int(dot) Shl 24|$ffffff)
Next
Next
UnlockImage(glow)
'==============================================================================================
'TYPES
'==============================================================================================
'----------------------- HELPERS
Type ms
Field x:Double
Field y:Double
Field scl_x:Float
Field scl_y:Float
Field speed:Double
Function Create:ms()
Return New ms
End Function
Method normalize:Double()
speed= x*x+y*y
If speed
speed= Sqr(speed)
x:/speed
y:/speed
EndIf
Return speed
EndMethod
EndType
Type color
Field r:Double
Field g:Double
Field b:Double
Field a:Double
Method Clear()
r = 0
g = 0
b = 0
a = 0
EndMethod
Method normalize()
Local t:Double
t = r*r+g*g+b*b
If t
t = 1.0/Sqr(t)
r:*t
g:*t
b:*t
EndIf
EndMethod
Method up()
r:*255
g:*255
b:*255
EndMethod
Function Create:color()
Return New color
End Function
EndType
'------------------------ ROCKET
Global spark_col:color = color.Create()
spark_col.r = 80'170
spark_col.g = 40'90
spark_col.b = 0
Global rocketlist:TList = CreateList()
Type rocket
Field pos:ms = ms.Create()
Field vel:ms = ms.Create()
Field col:color = color.Create() 'default=30,44,55
Field age:Float
Method draw()
pos.x:+vel.x
pos.y:+vel.y
vel.y:+0.1
SetAlpha 0.7
SetColor 155,103,25
Plot(pos.x,pos.y)
age:-0.01
End Method
Function update()
For Local ro:rocket = EachIn rocketlist
ro.draw()
explode.Create(ro.pos.x,ro.pos.y,-0.5+RndFloat(),-0.3*ro.vel.y,spark_col,(ro.age*0.7)^4,0)
If ro.age <= 0
Local vel:ms = ms.Create()
Local power:Float = 0.5*RndFloat()+0.05
Local count:Int = Rand(10,600)
Local bage:Float = 0.2+RndFloat()*0.8
Local typ:Byte = 3.001-(RndFloat()^4)*3
If typ < 2
For Local i:Int = 0 Until count
Local circ:Float = i*360*(RndFloat()*0.5+0.5)
Local push:Float = (2+RndFloat()*6)*power
Local velx:Float = Sin(circ)*push+ro.vel.x*0.3
Local vely:Float = Cos(circ)*push+(ro.vel.y*0.2-0.4)
Local age:Float = bage+RndFloat()*bage
If age>0.9 Then typ = 1 Else typ = 0
explode.Create(ro.pos.x,ro.pos.y,velx,vely,ro.col,age*2,typ)
Next
Else
If typ = 2
For Local i:Int = 0 Until (count*power*0.3)
Local circ:Float = i*360*(RndFloat()*0.5+0.5)
Local push:Float = power*(3+RndFloat())
Local velx:Float = Sin(circ)*push+ro.vel.x*0.3
Local vely:Float = Cos(circ)*push+(ro.vel.y*0.2-0.4)
explode.Create(ro.pos.x,ro.pos.y,velx,vely,ro.col,bage+RndFloat()*bage,typ)
Next
End If
If typ = 3
Local offset:Int = Rand(0,120)
For Local i:Int = 0 Until (count*power*0.3)
Local circ:Float = i*20*(RndFloat()*0.01+0.99)+offset
Local push:Float = power*(circ*0.002)
Local velx:Float = Sin(circ)*push+ro.vel.x*0.3
Local vely:Float = Cos(circ)*push+(ro.vel.y*0.2-0.4)
explode.Create(ro.pos.x,ro.pos.y,velx,vely,ro.col,bage+RndFloat()*bage,3)
Next
End If
End If
SetAlpha 1.0
SetColor 233,233,255
SetScale 6,3
DrawImage(glow,ro.pos.x,ro.pos.y)
drawstar(ro.pos.x, ro.pos.y,2)
rocketlist.Remove(ro)
EndIf
Next
End Function
Function Create:rocket(pos:ms,vel:ms, r:Int,g:Int,b:Int, age:Float)
Local ro:rocket = New rocket
ro.pos = pos
ro.vel = vel
ro.age = age
ro.col.r = r
ro.col.g = g
ro.col.b = b
ListAddLast rocketlist, ro
Return ro
EndFunction
End Type
'------------------------ EXPLODE
Function drawstar(posx:Float, posy:Float, scale:Float)
SetScale scale*5.5,0.1
SetRotation 45
DrawImage(glow,posx,posy)'Plot(posx,posy)
SetRotation -45
DrawImage(glow,posx,posy)'Plot(posx,posy)
SetRotation 0
End Function
Global explodelist:TList = CreateList()
Type explode
Field posx:Float
Field posy:Float
Field velx:Float
Field vely:Float
Field colr:Int
Field colg:Int
Field colb:Int
Field age:Float
Field dim:Float
Field typ:Byte
Method draw()
'velx:*((age/dim)*0.25+0.8)
'vely:*((age/dim)*0.25+0.8)
posx:+velx
posy:+vely
SetColor colr,colg,colb
Select typ
Case 0
vely:+0.005
Case 1
Local alp:Float = (age/dim)*(age Mod 0.2)/0.2
SetAlpha alp
velx:*(0.8+RndFloat()*0.3)
vely:*(0.8+RndFloat()*0.3)
If age<0.9 And alp>0.2
alp:*2
SetScale alp,alp
SetAlpha 0.1+0.25*alp
DrawImage(glow,posx,posy)'Plot(posx,posy)
SetAlpha 0.25*alp
drawstar(posx,posy,1.0)
SetScale 1,1
SetColor 255,255,255
End If
vely:+0.03
Case 2
SetAlpha 0.05
SetScale 5.5,0.1
drawstar(posx,posy,1.0)
SetColor 255,255,255
vely:+0.002
Case 3
SetAlpha 0.05
DrawImage(glow,posx,posy)
SetScale 0.5,0.5
If age<0.1 And age>0.04
SetAlpha 1.0-(age-0.04)/0.06;
drawstar(posx,posy,1.0)
EndIf
SetColor 255,255,255
vely:+0.002
End Select
SetAlpha (age/dim)^2
SetScale 0.2,0.2
DrawImage(glow,posx,posy)'Plot(posx,posy)
If posx<0 Or posx>scrx Or posy>scry Then explodelist.Remove(Self)
age:-0.01
SetAlpha 1.0
SetScale 1.0,1.0
End Method
Function update()
For Local ex:explode = EachIn explodelist
ex.draw()
If ex.age <= 0
explodelist.Remove(ex)
EndIf
Next
End Function
Function Create:explode(posx:Float,posy:Float,velx:Float,vely:Float, col:color, age:Float,typ:Byte)
Local ex:explode = New explode
ex.posx = posx
ex.posy = posy
ex.velx = velx
ex.vely = vely
ex.colr = col.r+(-0.2+0.2*RndFloat())*255
ex.colg = col.g+(-0.2+0.2*RndFloat())*255
ex.colb = col.b+(-0.2+0.2*RndFloat())*255
ex.age = age
ex.dim = age
ex.typ = typ
ListAddLast explodelist, ex
Return ex
End Function
End Type
'==============================================================================================
'GLOBALS
'==============================================================================================
Global wait:Int = 10
Global cpos:ms = ms.Create()
Global cvel:ms = ms.Create()
cpos.x = 400
cpos.y = 800
cvel.x = 0.3
cvel.y = -10
rocket.Create(cpos,cvel,255,200,50,1.0)
HideMouse
'************************************************************************************************
' GAME
'************************************************************************************************
'------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------------
Function fireworks()
Flip 1
SetBlend ALPHABLEND
SetAlpha 1.0
SetColor 25,45,95
SetScale 1,1
DrawImage(background,scrx*0.5,scry*0.5)
DrawImage(land,scrx*0.5,scry-50)
SetBlend LIGHTBLEND
SetAlpha 0.25
If wait <-200 Then SetAlpha 0.25-(201+wait)*0.001
SetColor 10,10,90-wait
DrawImage(glow,MouseX(),MouseY())
SetAlpha 1.0
Plot(MouseX(),MouseY())
If MouseDown(1) Or KeyDown(KEY_SPACE)Or KeyDown(KEY_R)Or KeyDown(KEY_G)Or KeyDown(KEY_B)Or KeyDown(KEY_Y)
If wait < 0
Local age:Float = Float(scry-MouseY())/scry
cpos:ms = ms.Create()
cvel:ms = ms.Create()
cpos.x = Rand(390,410)
cpos.y = scry-20
cvel.x = (MouseX()-cpos.x)/150
cvel.y = -(5+age*8)
If Not KeyDown(KEY_Z) Then cvel.x:+(-0.5+RndFloat()); age:*RndFloat();age:+1.0 Else age:+ Abs(Float(MouseX()-scrx*0.5)/(scrx*0.5))
Local csin:Float = 0.5+0.5*Sin(MilliSecs()*0.1)
Local cr:Float = csin/0.5
If cr<0 Then cr = 0
If cr>1.0 Then cr = 1.0
Local cg:Float = (csin-0.5)/0.5
If cg<0 Then cg=0
If cg>1.0 Then cg=1.0
Local cb:Float = (1.0-csin)
Local dot:Float = cr*cr+cg*cg+cb*cb
If dot
dot = 1.0/Sqr(dot)
cr:*dot
cg:*dot
cb:*dot
End If
cr=0.5+0.5*cr
cg=0.7+0.3*cg
If KeyDown(KEY_R) Then cr=1;cg=0.3;cb=0.1
If KeyDown(KEY_G) Then cr=0.1;cg=1;cb=0.3
If KeyDown(KEY_Y) Then cr=0.9;cg=1;cb=0.1
If KeyDown(KEY_B) Then cr=0.3;cg=0.1;cb=1
rocket.Create(cpos,cvel,cr*255,cg*255,cb*255,age)
SetAlpha 1.0
SetColor 125,60,20
SetScale 8,2
DrawImage(glow,cpos.x,cpos.y)
SetScale 1,0.5
DrawImage(glow,cpos.x,cpos.y)
wait = Rand(0,6)
Else
wait:-1
End If
End If
rocket.update()
explode.update()
End Function
'=============================================================================
'EVENT POLLS
'=============================================================================
Local close:Byte = 0
Repeat
close = 0
PollEvent()
If EventID() = 259 Then close = 1
fireworks()
Until KeyHit(KEY_ESCAPE) Or close |