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
 |