Hi,
ich hatte am Wochenende ein wenig zu viel Zeit.
Und so habe ich mich mal an einer Partikel lib versucht.
Sie läuft auch stabil und schnell. Ist allerdings nur 2D...
Befehle sind:
CreateEmitter(x,y,min_winkel#,max_winkel#,time,parts_activation,min_life,max_life,min_speed#,max_speed#,min_color,max_color$)
x,y ist die Position des Emitters
min und max_winkel die Ausstrahlrichtung
time ist die Zeit bis zur nächsten Ausgabe von Partikeln in ms
parts_activation ist die Anzahl der Partikel pro Ausgabe
min und max_life die Zeit wie lange ein Partikel "lebt"
min und max_speed die Geschwindigkeit
min_color die Farbuntergrenze
max_color die Farbobergrenze
Beides RGB Werte, lässt man max_color aus. Wird als Farbe min_color verwendet.
CreateParticle(x,y,winkel#,life,speed#,farbe)
x,y die Startposition
winkel die Flugrichtung
life Flugzeit
speed Fluggeschwindigkeit
farbe die Farbe des Partikels
Alle diese Werte werden normalerweise von CreateEmitter übernommen.
UpdateEmitters()
Updatet alle Emitter und sendet evtl. neue Partikel aus.
UpdateParticles()
Updatet alle Partikel, zeichnet oder löscht sie.
Beide Funktionen müssen in der Hauptschleife vor Flip und nach Cls aufgerufen werden.
Die lib verwendet weiterhin 2Types: TEmitter und TParticle
Code:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] SeedRnd MilliSecs()
Type TEmitter Field x,y,min_winkel#,max_winkel#,time#,akt_time# Field parts_per_activation,max_life,min_life,min_speed#,max_speed#,min_color,max_color Field activated End Type Type TParticle Field x#,y#,winkel#,life,Color,speed# End Type
Function CreateEmitter.TEmitter(x,y,min_winkel#,max_winkel#,time,parts_activation,min_life,max_life,min_speed#,max_speed#,min_color,max_color$="NOT") Local e.TEmitter=New TEmitter e\x=x e\y=y e\min_winkel=min_winkel e\max_winkel=max_winkel e\time=time e\parts_per_activation=parts_activation e\max_life=max_life e\min_life=min_life e\max_speed=max_speed e\min_speed=min_speed If max_color<>"NOT" e\max_color=max_color Else e\max_color=min_color End If e\min_color=min_color e\activated=True Return e End Function
Function CreateParticle.TParticle(x,y,winkel#,life,speed#,farbe) Local p.TParticle=New TParticle p\x=x p\y=y p\winkel=winkel p\life=life p\Color=farbe p\speed=speed Return p End Function
Function UpdateEmitters() Local e.TEmitter For e.TEmitter=Each TEmitter If e\activated=True If MilliSecs()>e\time+e\akt_time For k=1 To e\parts_per_activation CreateParticle(e\x,e\y,Rnd#(e\min_winkel#,e\max_winkel#),Rand(e\min_life,e\max_life),Rnd(e\min_speed,e\max_speed),Rand(e\max_color,e\max_color)) Next e\akt_time=MilliSecs() End If End If Next End Function Function UpdateParticles() Local p.TParticle,mon_width=GraphicsWidth(),mon_height=GraphicsHeight() LockBuffer BackBuffer() For p.TParticle=Each TParticle If p\life>0 And (p\x>1 And p\x<mon_width-2) And (p\y>1 And p\y<mon_height-2) WritePixelFast p\x,p\y,p\Color p\x = p\x + Cos#(p\winkel#)*-p\speed p\y = p\y + Sin#(p\winkel#)*p\speed p\life=p\life-1 Else Delete p.TParticle End If Next UnlockBuffer BackBuffer() End Function
Lauffähiges Beispiel:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Graphics 800,600,32,6 SetBuffer BackBuffer()
Include "Particles.bb"
Local Emitter0.TEmitter=CreateEmitter(400,300,0,360,1,3,1,100,1,5,6050532) Local Emitter1.TEmitter=CreateEmitter(100,10,0,180,1,3,5,50,1,5,6543182) Local Emitter2.TEmitter=CreateEmitter(200,10,0,180,1,3,5,50,1,5,6543182) Local Emitter3.TEmitter=CreateEmitter(300,10,0,180,1,3,5,50,1,5,6543182) Local Emitter4.TEmitter=CreateEmitter(400,10,0,180,1,3,5,50,1,5,6543182) Local Emitter5.TEmitter=CreateEmitter(500,10,0,180,1,3,5,50,1,5,6543182) Local Emitter6.TEmitter=CreateEmitter(600,10,0,180,1,3,5,50,1,5,6543182) Local Emitter7.TEmitter=CreateEmitter(700,10,0,180,1,3,5,50,1,5,6543182) Local Emitter8.TEmitter=CreateEmitter(100,600-10,0,-180,1,3,5,50,1,5,6543182) Local Emitter9.TEmitter=CreateEmitter(200,600-10,0,-180,1,3,5,50,1,5,6543182) Local Emitter10.TEmitter=CreateEmitter(300,600-10,0,-180,1,3,5,50,1,5,6543182) Local Emitter11.TEmitter=CreateEmitter(400,600-10,0,-180,1,3,5,50,1,5,6543182) Local Emitter12.TEmitter=CreateEmitter(500,600-10,0,-180,1,3,5,50,1,5,6543182) Local Emitter13.TEmitter=CreateEmitter(600,600-10,0,-180,1,3,5,50,1,5,6543182) Local Emitter14.TEmitter=CreateEmitter(700,600-10,0,-180,1,3,5,50,1,5,6543182) Local Emitter15.TEmitter=CreateEmitter(10,200,-90,-270,1,3,5,50,1,5,6543182) Local Emitter16.TEmitter=CreateEmitter(10,300,-90,-270,1,3,5,50,1,5,6543182) Local Emitter17.TEmitter=CreateEmitter(10,400,-90,-270,1,3,5,50,1,5,6543182) Local Emitter18.TEmitter=CreateEmitter(10,500,-90,-270,1,3,5,50,1,5,6543182) Local Emitter19.TEmitter=CreateEmitter(800-10,200,90,-90,1,3,5,50,1,5,6543182) Local Emitter20.TEmitter=CreateEmitter(800-10,300,90,-90,1,3,5,50,1,5,6543182) Local Emitter21.TEmitter=CreateEmitter(800-10,400,90,-90,1,3,5,50,1,5,6543182) Local Emitter22.TEmitter=CreateEmitter(800-10,500,90,-90,1,3,5,50,1,5,6543182)
Local fps#,FPS_LAST# Local timer=CreateTimer(60) While KeyHit(1)=0 Cls If MouseDown(1) For k=1 To 5 CreateParticle(MouseX(),MouseY(),Rnd(0,360),100,2,600500) Next End If If MouseHit(2) CreateEmitter(MouseX(),MouseY(),0,360,Rand(1,5),Rand(1,5),5,50,1,5,643215) End If If KeyHit(32) For e.TEmitter=Each TEmitter e\activated=False Next End If If KeyHit(30) For e.TEmitter=Each TEmitter e\activated=True Next End If UpdateEmitters() UpdateParticles() fps#=(19*fps#+(1000./(MilliSecs()-FPS_LAST)))/20.:FPS_LAST=MilliSecs() Text 1,600-15,fps#+" FPS" WaitTimer timer Flip 0 Wend End
Wenn ihr noch irgendwelche Fehler findet sagt es, ich werde sie dann beheben.
Ansonsten viel spaß mit meiner Partikel lib.
mfg,
count-doku
EDIT: Das [B3D] entfernt.
EDIT2: Kleinen Geschwindigkeitsvorteil eingebaut. Danke Eingeproggt!
|