ich hab für mein game nen partikelmanager benötigt
und dazu hab ich den alten aus der sample blibliothek modifiziert
wenn ihn jemand haben will.
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN]
Const PM_StandartTemplates= 6
Type Particle Field entity Field vectors#[4] Field colors#[6] Field age#, maxage# Field fade Field emitter.emitter Field rotation#,angle# End Type
Type Emitter Field emitpos#[3] Field entity Field loop Field templateid Field particletimer# Field particle.Particle Field timer Field connectparticles End Type
Type Template Field sprite Field gravity# Field viewmode Field minage,maxage Field fade Field nopart# Field positions#[6] Field vectors#[6] Field colors[6] Field rotation# End Type
Global PM_DefaultTemplate[PM_StandartTemplates-1]
Global PM_FirstUse Global PM_ActiveTemplatePosition Global PM_DefaultTexture
Global PM_TemplateBlend Global PM_TemplateGravity# Global PM_TemplateMinAge# Global PM_TemplateMaxAge# Global PM_TemplateXSize# Global PM_TemplateYSize# Global PM_TemplateFade Global PM_TemplateColor#[3] Global PM_TemplateColorM#[3] Global PM_TemplateNrOfParticles# Global PM_TemplatePosition#[6] Global PM_TemplateSpeed#[6] Global PM_TemplateRotation# Global PM_TemplateFileName$
Function PM_SetTemplateSprite( filename$, blend, fade )
PM_TemplateBlend= blend PM_TemplateViewMode= 1 PM_TemplateFade= fade PM_TemplateFileName= filename$
End Function
Function PM_SetTemplateTime( min#, max# )
PM_TemplateMinAge#= min PM_TemplateMaxAge#= max
End Function
Function PM_SetTemplateSize( xsize#, ysize# )
PM_TemplateXSize#= xsize PM_TemplateYSize#= ysize
End Function
Function PM_SetTemplateVelocity( minvx#, maxvx#, minvy#, maxvy#, minvz#, maxvz#, gravity#)
PM_TemplateSpeed[1]= minvx# PM_TemplateSpeed[2]= maxvx#
PM_TemplateSpeed[3]= minvy# PM_TemplateSpeed[4]= maxvy#
PM_TemplateSpeed[5]= minvz# PM_TemplateSpeed[6]= maxvz#
PM_TemplateGravity#= gravity
End Function
Function PM_SetTemplateParticles( nopart )
PM_TemplateNrOfParticles= nopart
End Function
Function PM_SetTemplateColors( red#,green#,blue# ,mred#, mgreen#, mblue# )
PM_TemplateColor[1]= red PM_TemplateColor[2]= green PM_TemplateColor[3]= blue
PM_TemplateColorM[1]= mred PM_TemplateColorM[2]= mgreen PM_TemplateColorM[3]= mblue
End Function
Function PM_SetTemplatePosition( minx#, maxx#, miny#, maxy#, minz#, maxz#) PM_TemplatePosition[1]= minx PM_TemplatePosition[2]= maxx
PM_TemplatePosition[3]= miny PM_TemplatePosition[4]= maxy
PM_TemplatePosition[5]= minz PM_TemplatePosition[6]= maxz
End Function
Function PM_SetTemplateRotation( rot# ) PM_TemplateRotation#= rot
End Function
Function PM_SetTemplateDefault( )
PM_TemplateBlend= 3 PM_TemplateViewMode= 1 PM_TemplateGravity#= 0.01 PM_TemplateMinAge#= 20 PM_TemplateMaxAge#= 100 PM_TemplateXSize#= 10 PM_TemplateYSize#= 10 PM_TemplateFade= True PM_TemplateColor[1]= 255 PM_TemplateColor[2]= 255 PM_TemplateColor[3]= 255
PM_TemplateColorM[1]= 1 PM_TemplateColorM[2]= 1 PM_TemplateColorM[3]= 1
PM_TemplateNrOfParticles= 20
PM_TemplatePosition[1]= 0 PM_TemplatePosition[2]= 0 PM_TemplatePosition[3]= 0 PM_TemplatePosition[4]= 0 PM_TemplatePosition[5]= 0 PM_TemplatePosition[6]= 0
PM_TemplateSpeed[1]= 1 PM_TemplateSpeed[2]= 2 PM_TemplateSpeed[3]= 1 PM_TemplateSpeed[4]= 2 PM_TemplateSpeed[5]= 1 PM_TemplateSpeed[6]= 2
PM_TemplateRotation#= 0 PM_TemplateFileName= \"\"
End Function
Function PM_ReadDefaultTexture() Local x,y,gray, xsize,ysize PM_DefaultTexture= CreateTexture(16,16) SetBuffer TextureBuffer(PM_DefaultTexture) Restore sparkdata Read xsize, ysize
For y = 0 To xsize-1 For x= 0 To ysize-1 Read gray Color gray,gray,gray Plot x,y Next Next SetBuffer BackBuffer()
End Function
Function PM_CreateSprite() Local sprite sprite= CreateSprite() EntityTexture sprite, PM_DefaultTexture Return sprite End Function
Function PM_CreateTemplate() Local viewmode,t,ptemplate.template
t= PM_ActiveTemplatePosition PM_ActiveTemplatePosition= PM_ActiveTemplatePosition+1 ptemplate.template = New Template
ptemplate\viewmode= PM_TemplateViewMode ptemplate\gravity= PM_TemplateGravity# ptemplate\minage= PM_TemplateMinAge# ptemplate\maxage= PM_TemplateMaxAge# ptemplate\fade= PM_TemplateFade ptemplate\colors[1]= PM_TemplateColor[1] ptemplate\colors[2]= PM_TemplateColor[2] ptemplate\colors[3]= PM_TemplateColor[3] ptemplate\colors[4]= PM_TemplateColorM[1] ptemplate\colors[5]= PM_TemplateColorM[2] ptemplate\colors[6]= PM_TemplateColorM[3] ptemplate\nopart= ( PM_TemplateNrOfParticles / ( PM_TemplateMinAge# + PM_TemplateMaxAge# ) ) / 2 ptemplate\positions[1]= PM_TemplatePosition[1] ptemplate\positions[2]= PM_TemplatePosition[2]
ptemplate\positions[3]= PM_TemplatePosition[3] ptemplate\positions[4]= PM_TemplatePosition[4]
ptemplate\positions[5]= PM_TemplatePosition[5] ptemplate\positions[6]= PM_TemplatePosition[6]
ptemplate\vectors[1]= PM_TemplateSpeed[1] ptemplate\vectors[2]= PM_TemplateSpeed[2]
ptemplate\vectors[3]= PM_TemplateSpeed[3] ptemplate\vectors[4]= PM_TemplateSpeed[4]
ptemplate\vectors[5]= PM_TemplateSpeed[5] ptemplate\vectors[6]= PM_TemplateSpeed[6] ptemplate\rotation= PM_TemplateRotation If PM_TemplateFileName = \"\" ptemplate\sprite= PM_CreateSprite() Else ptemplate\sprite = LoadSprite( PM_TemplateFileName ) EndIf EntityBlend ptemplate\sprite,PM_TemplateBlend
SpriteViewMode ptemplate\sprite,1
ScaleSprite ptemplate\sprite,PM_TemplateXSize#,PM_TemplateYSize# RotateSprite ptemplate\sprite,PM_TemplateRotation# HideEntity ptemplate\sprite
Return Handle(ptemplate) End Function
Function PM_ReadStandartTemplates()
Local t,filename$,blend,viewmode,xsize#,ysize#,rot# Restore sparks0 For t = 0 To PM_StandartTemplates-1
Read PM_TemplateFileName$ Read PM_TemplateBlend Read PM_TemplateViewMode Read PM_TemplateGravity# Read PM_TemplateMinAge#, PM_TemplateMaxAge# Read PM_TemplateXSize#, PM_TemplateYSize# Read PM_TemplateFade Read PM_TemplateColor[1],PM_TemplateColor[2],PM_TemplateColor[3] Read PM_TemplateColorM[1], PM_TemplateColorM[2], PM_TemplateColorM[3] Read PM_TemplateNrOfParticles Read PM_TemplatePosition[1], PM_TemplatePosition[2] Read PM_TemplatePosition[3], PM_TemplatePosition[4] Read PM_TemplatePosition[5], PM_TemplatePosition[6] Read PM_TemplateSpeed[1], PM_TemplateSpeed[2] Read PM_TemplateSpeed[3], PM_TemplateSpeed[4] Read PM_TemplateSpeed[5], PM_TemplateSpeed[6] Read PM_TemplateRotation#
PM_DefaultTemplate[t]= PM_Createtemplate() Next End Function
Function PM_AddEmitter(t, xpos#,ypos#,zpos#, loop, parent, connectparent, connectparticles) Local nopart,i If Object.template(t)= Null : Return 0 : EndIf
e.Emitter= New Emitter
If parent = 0 e\entity= CreatePivot() PositionEntity e\entity, xpos,ypos,zpos Else e\entity= CreatePivot(parent) MoveEntity e\entity, xpos, ypos, zpos If connectparent= False : EntityParent e\entity,0 : EndIf EndIf e\emitpos[1]= xpos e\emitpos[2]= ypos e\emitpos[3]= zpos e\loop= loop e\templateid= t e\particletimer= 0 e\particle= Null e\timer= 0 e\connectparticles= connectparticles Return Handle(e) End Function
Function PM_RemoveEmitter(ehandle ,removeparticles) e.emitter= Object.emitter(ehandle) If e.emitter= Null Return
p.particle= e\particle While p<> Null If p\emitter <> e Exit p2.particle= After p If removeparticles FreeEntity p\entity Delete p Else p\emitter= Null EntityParent p\entity,0 EndIf p= p2 Wend FreeEntity e\entity Delete e End Function
Function PM_DisconnectEmitter(ehandle) e.emitter= Object.emitter(ehandle) If e.emitter= Null Return EntityParent e\entity, 0 End Function
Function PM_ConnectEmitter(ehandle, parent, changeposition) e.emitter= Object.emitter(ehandle) If e.emitter= Null Return
If changeposition PositionEntity e\entity, EntityX(parent), EntityY(parent), EntityZ(parent) RotateEntity e\entity, EntityPitch(parent), EntityYaw(parent), EntityYaw(parent) EntityParent e\entity, parent EndIf End Function
Function PM_Update() Local time#,red#,green#,blue#,i,ptemplate.template
For e.Emitter= Each Emitter ptemplate.template= Object.template(e\templateid) If e\loop= True e\particletimer= e\particletimer+ptemplate\nopart Else If e\timer= 0 e\particletimer= ptemplate\nopart * (ptemplate\maxage+ptemplate\minage) /2 EndIf e\timer= e\timer+1 EndIf While e\particletimer > 1 e\particletimer= e\particletimer-1 If e\particle.particle= Null e\particle.Particle= New particle p.particle= e\particle.Particle Else p.particle= New particle Insert p After e\particle EndIf
p\emitter.emitter= e.emitter p\entity = CopyEntity( ptemplate\sprite, e\entity ) If e\connectparticles= False EntityParent p\entity,0 EndIf
p\vectors[1]= Rnd(ptemplate\vectors[1], ptemplate\vectors[2]) p\vectors[2]= Rnd(ptemplate\vectors[3], ptemplate\vectors[4]) p\vectors[3]= Rnd(ptemplate\vectors[5], ptemplate\vectors[6]) p\vectors[4]= ptemplate\gravity
p\age= 0 p\maxage= Rnd( ptemplate\minage, ptemplate\maxage ) p\rotation= ptemplate\rotation p\fade= ptemplate\fade For i= 1 To 6 :p\colors[i]= ptemplate\colors[i]: Next Wend If e\timer > ptemplate\maxage PM_RemoveEmitter(Handle(e),True) EndIf
Next For p.particle= Each particle p\age= p\age+1 If p\age < p\maxage MoveEntity p\entity, p\vectors[1], p\vectors[2], p\vectors[3] If p\rotation <> 0 p\angle= (p\angle+p\rotation) Mod 360 RotateSprite p\entity, p\angle EndIf p\vectors[2]= p\vectors[2]- p\vectors[4] time= p\age/p\maxage red#= p\colors[1] + (p\colors[4]-p\colors[1])* time green#= p\colors[2] + (p\colors[5]-p\colors[2])* time blue#= p\colors[3] + (p\colors[6]-p\colors[3])* time EntityColor p\entity, red#,green#,blue# If p\fade EntityAlpha p\entity, 1-time EndIf Else If p\emitter <> Null If p\emitter\particle= p newparticle.particle= p\emitter\particle newparticle.particle= After newparticle If newparticle <> Null If newparticle\emitter= p\emitter p\emitter\particle= newparticle Else p\emitter\particle= Null EndIf Else p\emitter\particle= Null EndIf EndIf EndIf FreeEntity p\entity Delete p EndIf Next
End Function
Function InitParticleManager(clearentitys) Local i, ptemplate.template, e.emitter, p.particle
If clearentitys If PM_DefaultTexture <> 0 FreeTexture PM_DefaultTexture EndIf For ptemplate.template= Each template If ptemplate\sprite <> 0 FreeEntity ptemplate\sprite EndIf Next For e.emitter= Each emitter If e\entity <> 0 FreeEntity e\entity EndIf Next For p.particle= Each particle If p\entity <> 0 FreeEntity p\entity EndIf Next EndIf For ptemplate.template= Each template Delete ptemplate Next For e.emitter= Each emitter Delete e Next For p.particle= Each particle Delete p Next
PM_ReadDefaultTexture() PM_ReadStandartTemplates() End Function
.sparkdata Data 16, 16 Data 5, 6, 5, 5, 10, 3, 3, 7, 7, 6, 4, 5, 4, 3, 3, 4 Data 2, 13, 15, 15, 15, 12, 10, 25, 15, 19, 15, 14, 12, 12, 12, 8 Data 6, 7, 21, 29, 27, 34, 26, 39, 22, 43, 38, 27, 23, 23, 16, 9 Data 3, 15, 15, 37, 51, 43, 40, 52, 42, 54, 43, 45, 41, 22, 12, 3 Data 7, 11, 26, 34, 56, 65, 72, 67, 73, 67, 62, 60, 45, 27, 16, 9 Data 4, 16, 37, 51, 58, 87, 93, 94,105, 93, 89, 66, 48, 38, 21, 6 Data 4, 7, 26, 44, 78, 95,140,158,164,145,103, 78, 52, 42, 17, 5 Data 6, 18, 35, 46, 61,100,171,232,236,185,112, 72, 51, 32, 19, 7 Data 7, 16, 35, 53, 81,117,187,248,250,189,111, 78, 58, 38, 23, 10 Data 8, 14, 32, 45, 61, 97,163,215,205,165,100, 68, 47, 33, 19, 8 Data 1, 4, 21, 46, 75, 91,116,138,118,107, 92, 72, 42, 31, 9, 6 Data 4, 14, 31, 48, 60, 74, 87, 87, 77, 62, 71, 59, 49, 19, 15, 6 Data 9, 14, 22, 34, 50, 52, 56, 61, 49, 46, 42, 50, 31, 26, 12, 4 Data 3, 11, 15, 28, 27, 35, 35, 37, 31, 33, 19, 24, 25, 19, 18, 6 Data 4, 9, 15, 15, 20, 18, 15, 14, 8, 15, 9, 9, 14, 15, 11, 9 Data 2, 7, 8, 6, 8, 2, 2, 4, 4, 7, 5, 1, 4, 1, 5, 6
.sparks0
Data \"\" Data 3 Data 1 Data 0 Data 30,30 Data 2,2 Data True Data 255,255,0 Data 0,-5,0 Data 30 Data 0,0 Data 0,0 Data 0,0 Data -2,2 Data -2,2 Data -2,2 Data 0
.rain1
Data \"\" Data 3 Data 4 Data 1 Data 10,20 Data .3,10 Data 0 Data 255,255,255 Data 10,0,0 Data 200 Data -250,250 Data 0,0 Data -250,250 Data 0,0 Data -8,-8 Data 0,0 Data 0
.fire2
Data \"\" Data 3 Data 4 Data 0 Data 10,50 Data 1,4 Data True Data 255,255,0 Data -5,-10,0 Data 16 Data -.5,.5 Data -.5,.5 Data -.5,.5 Data -.05,.05 Data .2,.3 Data -.05,.05 Data 0
.magic3
Data \"\" Data 3 Data 1 Data 0.01 Data 50,250 Data 4,4 Data True Data 0,255,0 Data 155,200,100 Data 100 Data -5,5 Data -5,5 Data -5,5 Data -.1,.1 Data -.1,.1 Data -.1,.1 Data 2
.fountain4
Data \"\" Data 3 Data 1 Data .2 Data 25,50 Data 5,5 Data False Data 255,255,0 Data 132,5,140 Data 400 Data 0,0 Data -12,-12 Data 0,0 Data -1.5,1.5 Data 4,6 Data -1.5,1.5 Data 0
.firesparks5
Data \"\" Data 3 Data 1 Data .001 Data 20,100 Data .1,.1 Data True Data 255,128,0 Data 0,0,0 Data 4 Data -.5,.5 Data 0,0 Data -.5,.5 Data -.1,.1 Data .1,.2 Data -.1,.1 Data 0
und zum veranschaulichen gibs noch ein demo program dazu
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Include \"particlemanager.bb\"
Graphics3D 640,480,16,2 InitParticleManager(True)
Global i= 1,emitt
cam= CreateCamera() MoveEntity cam, 0,0,-160
Dim emitter(1000)
mouse= CreateSphere() ScaleEntity mouse, 4,4,4
Global magictemplate
PM_SetTemplateSprite( \"\", 3, True ) PM_SetTemplateTime( 50, 250 ) PM_SetTemplateSize( 20, 20 ) PM_SetTemplateVelocity( -0.4, 0.4,-0.4, 0.4,-0.4, 0.4, 0.01) PM_SetTemplateParticles( 100 ) PM_SetTemplateColors( 0,255,0 ,155, 200, 100 ) PM_SetTemplatePosition( -20, 20,-20, 20, -20, 20) PM_SetTemplateRotation( 1 ) magictemplate= PM_CreateTemplate()
HidePointer
While Not KeyHit(1)
If MouseHit(1) If i < 1000 i= i+1 If KeyDown(57) emitter(i)= PM_AddEmitter(magictemplate,0,0,0,True, mouse, True, False) Else emitter(i)= PM_AddEmitter(PM_DefaultTemplate[4],0,0,0,True, mouse, True, False) EndIf EndIf EndIf
If MouseHit(2) If (i > 1) PM_RemoveEmitter(emitter(i), False) i= i-1 EndIf EndIf If MouseHit(3) PM_Disconnectemitter(emitter(i)) EndIf PositionEntity mouse, (MouseX()-320.0)/2.0,-(MouseY()-240.0)/2.0,0
PM_Update() RenderWorld : Flip Wend
ich hoffe die modifikation nützt euch was.
mfg stfighter
p.s.: ich lehne alle rechte an diesem programm ab, ich hab es nicht geschrieben, sondern nur modifiziert, daher ist es nicht mein, sondern das program von A.Gore
|