Counts Partikel Lib

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

count-doku

Betreff: Counts Partikel Lib

BeitragMo, Mai 03, 2010 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
Arrow 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.

Arrow 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.

Arrow UpdateEmitters()
Updatet alle Emitter und sendet evtl. neue Partikel aus.
Arrow 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]
;Particle library from Count-Doku
SeedRnd MilliSecs()

Type TEmitter;Type for Emitters
Field x,y,min_winkel#,max_winkel#,time#,akt_time#
;mit x,y Position ; Abstrahlwinkel ; Zeit bis zur nächsten Partikelemission ; aktuelle Zeit
Field parts_per_activation,max_life,min_life,min_speed#,max_speed#,min_color,max_color
; Partikel pro Emmision ; Leben der Partikel ; Min_Geschw ; Max_Geschw ; Farbbereich
Field activated
End Type
Type TParticle;Type for Particles
Field x#,y#,winkel#,life,Color,speed#
;mit x,y Position ; Winkel ; Leben ; Farbe
End Type

;New Emitter
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
;New Particle
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
;Update them
Function UpdateEmitters()
Local e.TEmitter
For e.TEmitter=Each TEmitter;Go thrue all Emitters
If e\activated=True
If MilliSecs()>e\time+e\akt_time;time to send out a new particle?
For k=1 To e\parts_per_activation;How many?
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;Go thrue all Particles
If p\life>0 And (p\x>1 And p\x<mon_width-2) And (p\y>1 And p\y<mon_height-2);On screen and at "live"?
WritePixelFast p\x,p\y,p\Color;draw Particles
p\x = p\x + Cos#(p\winkel#)*-p\speed;Calculate new position
p\y = p\y + Sin#(p\winkel#)*p\speed
p\life=p\life-1
Else;Delete if they are out of screen or "dead"
Delete p.TParticle
End If
Next
UnlockBuffer BackBuffer()
End Function


Lauffähiges Beispiel:
BlitzBasic: [AUSKLAPPEN]
;Partikel test file
Graphics 800,600,32,6;init Graphic
SetBuffer BackBuffer();set backbuffer

Include "Particles.bb";Include the Particle lib

Local Emitter0.TEmitter=CreateEmitter(400,300,0,360,1,3,1,100,1,5,6050532);Some demo emitter
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#;FPS
Local timer=CreateTimer(60);Timer
While KeyHit(1)=0

Cls
If MouseDown(1);Left Mousebutton generates 5 new Particles
For k=1 To 5
CreateParticle(MouseX(),MouseY(),Rnd(0,360),100,2,600500)
Next
End If
If MouseHit(2);Right Mousebutton generates new Emitter
CreateEmitter(MouseX(),MouseY(),0,360,Rand(1,5),Rand(1,5),5,50,1,5,643215)
End If
If KeyHit(32) ;stop emitters
For e.TEmitter=Each TEmitter
e\activated=False
Next
End If
If KeyHit(30) ;start emitters
For e.TEmitter=Each TEmitter
e\activated=True
Next
End If
UpdateEmitters();Update Emitters
UpdateParticles();Update Particles
fps#=(19*fps#+(1000./(MilliSecs()-FPS_LAST)))/20.:FPS_LAST=MilliSecs();count FPS
Text 1,600-15,fps#+" FPS";show 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!
  • Zuletzt bearbeitet von count-doku am Sa, Mai 22, 2010 20:39, insgesamt 4-mal bearbeitet

Eingeproggt

BeitragMo, Mai 03, 2010 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs noch nicht getestet aber nach kurzem durchschauen des Codes würd ich sagen kann das [B3D] im Threadtitel weg oder?
und ein ganz klein wenig mehr Geschwindigkeit wär drin wenn du in "UpdateParticles" GraphicsWidth bzw. GraphicsHeight in Variablen speicherst anstatt sie für jeden Partikel erneut aufzurufen.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

count-doku

BeitragDi, Mai 04, 2010 8:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das mit in einer Variable speichern würde es beschleunigen,
allerdings wollte ich in der Lib komplett auf eine globale Variable verzichten.

Habs aber mal in einem Testprog ausprobiert:
Ohne Debugger:
Mit GraphicsWidth und GraphicsHeight: 2ms
Mit Variable die einmal definiert wird: 1.5ms


mfg,
count-doku

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group