Code archives/3D Graphics - Misc/Particle Emitter
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
this is a free, simple particle emitter, feel free to use it in your own code. you will need to provide the particle bitmap pref 64x64 or(128x128) round with a black (rgb 0,0,0) background. all the variables are adjustable- play with them... | |||||
Graphics3D 800,600 ; LOAD YOUR OWN PARTICle here p=LoadSprite("particle.bmp",8) SetBuffer BackBuffer () cam = CreateCamera () MoveEntity cam,0,0,-50 Type emitter Field xpos#,ypos#,zpos# ; position of the emitter Field duration ; duration that the emitter emits in milliseconds Field winddirection ; Field windspeed# ; Field xvel#,yvel#,zvel# ; initial velocities of the particles Field emissionspeed# ; Field xrange#,yrange#,zrange# ; the width of the emitters "emission zone" Field partweight# ; the weight of each particle Field partelasticity# ; particles "bounciness" Field entity ; a TYPE handle to attach the entity to (sprite) Field partlife ; Field alpha# Field spangle# End Type box=CreateCube() ScaleEntity(box,5,5,5) For x = 1 To 100 b.emitter = New emitter b\entity = CopyEntity(p) b\alpha# = Rnd(.3,.9) EntityAlpha(b\entity,b\alpha#) Next ; play with these variables to change the emitter psx#= 100 psy#= 0 psz#= 100 vlx#= .1 vly#= .5 vlz#= .1 xrnge#= 5 yrnge#= 5 zrnge#= 5 dur= 4 widspdx#= 0 widspdz#= 0 wddir= 3 prtwt#= 3 elast#= 3 plife= 200 ; LOOP w#=-.01 ; temp windspeed changes??? Repeat If KeyDown (203) TurnEntity cam,0,1,0 If KeyDown (205) TurnEntity cam,0,-1,0 If KeyDown(200) Then MoveEntity cam,0,0,.5 If KeyDown(201) Then MoveEntity cam,0,0,-.5 ;emit(posx#,posy#,posz#,velx#,vely#,velz#,xrange#,yrange#,zrange#,duration,windspeed#,winddir,partwt#,elastic#, partlife) ;emit(100,0,100,.1,.5,.1,15,15,15,5,5,12,.01,.9,60) If dir=0 Then w#=W#+.0001 If W#>.01 Then dir=1 If dir=1 Then w#=w#-.0001 If w#<-.01 Then dir=0 r=r+1 If r>360 Then r=0 psx#=Sin(r)*10 psz#=Cos(r)*10 PositionEntity(box,psx#,psy#,psz#) emit(psx#,psy#,psz#,vlx#,vly#,vlz#,xrnge#,yrnge#,zrnge#,dur,w#,w#,wddir,prtwt#,elast#, plife) ;emit(100,0,100,.1,-1.3,.1,315,315,305,5,5,12,.01,.9,120) ; snow ;emit(100,0,100,-3,.3,.3,20,5,5,1,500,12,.01,.9,120) ;emit(100,0,100,.3,.3,.3,5,5,5,1,0,5,.01,.9,120) UpdateWorld RenderWorld Flip Until KeyHit (1) Function emit(posx#,posy#,posz#,velx#,vely#,velz#,xrange#,yrange#,zrange#,duration,windspeedx#,windspeedz#,winddir,partwt#,elastic#, partlife) For b.emitter = Each emitter If b\partlife<0 b\xpos#=Rnd(posx#,posx#+xrange#) b\ypos#=Rnd(posy#,posy#+yrange#) b\zpos#=Rnd(posz#,posz#+zrange#) b\xvel#=Rnd(-velx#,velx#) b\yvel#=vely# b\zvel#=Rnd(-velx#,velz#) b\partweight#=partwt# b\partelasticity#=elastic# b\partlife=Rnd(partlife-40,partlife+40) sc#=Rnd(.1,3) ScaleSprite (b\entity,sc#,sc#) EndIf b\xpos#=b\xpos#+b\xvel# b\xvel#=b\xvel#-.001+windspeedx# ; windresistance and vel b\ypos#=b\ypos#+b\yvel# b\yvel#=b\yvel#-.01; gravity b\zpos#=b\zpos#+b\zvel# b\zvel#=b\zvel#-.001+windspeedz# b\partlife = b\partlife - 1 PositionEntity b\entity,b\xpos#,b\ypos#,b\zpos# b\spangle#=b\spangle#+2 If b\spangle#>360 Then b\spangle#=1 RotateSprite b\entity,b\spangle# Next End Function |
Comments
None.
Code Archives Forum