Rudimentary Particle Emitter
Monkey Forums/Monkey Code/Rudimentary Particle Emitter
| ||
| This is a basic particle emitter. Feel free to use it or abuse it any way you wish. Import mojo Class Particle Field X#, Y#, XD#, YD# Field Age# = 1.0 Field DecayRate# Field GravityX# = 0.0 Field GravityY# =0.0 Method New(x#, y#, Scatter) Self.X = x Self.Y = y Self.XD = Rnd(-Scatter, Scatter) Self.YD = Rnd(-Scatter, Scatter) Self.Age = Rnd() Self.DecayRate = Rnd(.005, .01) End Method Method Update() X += XD + GravityX Y += YD + GravityY If X < 0 Or X > DeviceWidth Then Age = 0 If Y < 0 Or Y > DeviceWidth Then Age = 0 Age -= DecayRate End Method End Class Class ParticleEmitter Field Particles:= New List<Particle> Field Scatter#, ParticleCount Field GravityX# = 0, GravityY# = 0 Field ParticleImage:Image Field RemainingParticles Method New(x#, y#, scatter#, particleCount, particleImage:Image, gravX#, gravY#) GravityX = gravX GravityY = gravY For Local i = 0 To ParticleCount Particles.AddLast(New Particle(x, y, scatter)) Next Self.ParticleImage = particleImage RemainingParticles = particleCount End Method Method Update() Local LiveParticles:= New List<Particle> For Local p:Particle = Eachin Particles p.GravityX = GravityX p.GravityY = GravityY p.Update() If p.Age > 0 Then LiveParticles.AddLast(p) Next Particles = LiveParticles RemainingParticles = Particles.Count End Method Method Render() For Local p:Particle = Eachin Particles SetAlpha p.Age SetBlend LightenBlend SetColor Rnd(100,255), Rnd(100,255), Rnd(100,255) DrawImage (ParticleImage, p.X, p.Y,0,p.Age, p.Age) Next End Method End Class Class ParticleManager Field ParticleEmitters:= New List<ParticleEmitter> Field TotalParticles = 0 Method AddParticleEmitter(x#, y#, scatter#, particleCount, particleImage:Image, gravX#, gravY#) ParticleEmitters.AddLast( New ParticleEmitter ( x, y, scatter, particleCount, particleImage, gravX, gravY ) ) End Method Method Update() Local LivePE:= New List<ParticleEmitter> TotalParticles = 0 For Local pe:= Eachin ParticleEmitters pe.Update() If pe.RemainingParticles > 0 LivePE.AddLast(pe) TotalParticles += pe.RemainingParticles End If Next ParticleEmitters = LivePE End Method Method Render() For Local pe:= Eachin ParticleEmitters pe.Render() Next End Method End Class Here's a test program
Import mojo
Import particleemitter
Class ParticleEmitterTester Extends App
Field PMgr:ParticleManager = New ParticleManager
Field Spark:Image
Method OnCreate()
SetUpdateRate 60
Spark = LoadImage ("bluspark.png")
End Method
Method OnUpdate()
Local gx# = 0.0, gy# = 0.0
For Local i = 0 To 32
If TouchDown(i)
#if TARGET = "android" Or TARGET = "ios"
gx = 2 * AccelX()
gy = 2* AccelY()
#endif
PMgr.AddParticleEmitter(TouchX(i), TouchY(i), 2, 100, Spark, gx, gy)
End If
Next
PMgr.Update()
End Method
Method OnRender()
Cls
PMgr.Render()
End Method
End Class
Function Main()
New ParticleEmitterTester
End Function
|