Additive Blended Particle Flames
Monkey Forums/Monkey Code/Additive Blended Particle Flames
| ||
![]() Youtube suggested I look at this channel and I found this video on it where it shows you basically how to make somewhat realistic looking flames. Here : Here the html5 version on my webpage : http://cromdesi.home.xs4all.nl/html5/additiveflames/MonkeyGame.html Here the code :
Import mojo
Global screenwidth:Int=640
Global screenheight:Int=480
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
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:Int,y:Int
Method New(x:Int,y:Int,angle:Int)
Self.x = x
Self.y = y
Self.sw = screenwidth
Self.sh = screenheight
Self.angle = angle
pixels = New Int[iw*ih]
image = CreateImage(iw,ih,image.MidHandle)
makeimage()
p.AddFirst(New particle(x,y,angle))
End Method
Method update()
If Rnd() < 0.4
p.AddFirst(New particle(x,y,angle))
End If
For Local i:=Eachin p
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
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
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 mype:particleeffect
Global mype2:particleeffect
Global mype3:particleeffect
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(60)
mype = New particleeffect(100,200,270)
mype2 = New particleeffect(320,200,270)
mype3 = New particleeffect(640-100,200,270)
End Method
Method OnUpdate()
mype.update()
mype2.update()
mype3.update()
End Method
Method OnRender()
Cls 50,50,50
mype.draw()
mype2.draw()
mype3.draw()
DrawImage mype.image,0,0
End Method
End Class
Function Main()
New MyGame()
End Function
|
