simple 2d-partikel...

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

maximilian

Betreff: simple 2d-partikel...

BeitragFr, Aug 20, 2004 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend!

Etwas für die n00bs zum lernen. Very Happy

Ich denke, der Code ist noch halbwegs akzeptabel (hab ich inner Viertelstunde mal hingeschmiert). Mann kann eine ganze Sache daraus lernen (z.B Types).

Habt Spaß damit!


BlitzBasic: [AUSKLAPPEN]

;
; 2D-Partikel
;


Type particle1
Field x
Field y
Field radius
Field frame
End Type

Global particle.particle1
Global anz ;--------Anzahl der Partikel

Graphics 800, 600, 16, 2
SetBuffer BackBuffer()

AppTitle "2D-Partikel by LordChaos" ;--------Webung *g*

HidePointer()

While Not KeyDown(1)

Cls

If MouseDown(1) = True Then
anz = anz + 6 ;--------6 Partikel kommen hinzu, aber nur ein Type-Eintrag
CreateParticles(MouseX(), MouseY(), 126) ;-Erstellt eine Partikel-"Explosion"
End If

UpdateParticles() ;--------aktualisiert alle Partikel-"Explosionen"

Color 255, 255 ,255
Oval MouseX(), MouseY(), 10, 10

Text 0, 0, "Particles:"+anz ;--------Anzahl

Flip


Wend

End

Function CreateParticles(pos_x, pos_y, radius)

particle = New particle1

particle\x = pos_x
particle\y = pos_y
particle\radius = radius

End Function

Function UpdateParticles()

For particle = Each particle1

;--------Farbverlauf
Color 0, 255-particle\frame*2, 0

For a = 1 To 360 Step 64 ;--------so kleiner der Step-Wert, desto mehr Partikel
;--------der Partikel-Zähler muss korrigiert werden

;--------Punkte werden berechnet (simpel, sogar ich hab das mit Sin/Cos hinbekommen,
;--------obwohl ich es noch nicht in der Schule hatte)
x = Sin(a) * particle\frame
y = Cos(a) * particle\frame
x1 = Sin(a) * (particle\frame + 10)
y1 = Cos(a) * (particle\frame + 10)


;--------zum rumspielen
;Line particle\x + x, particle\y + y, particle\x + x1, particle\y + y1
;Plot particle\x + x, particle\y + y
Oval particle\x + x, particle\y + y, 20, 20

Next

;--------Eintrag löschen
particle\frame = particle\frame + 1
If particle\frame > particle\radius Then Delete particle: anz = anz - 6


Next


End Function


Grüße,
LordChaos

Edit: Achja, es ist keine Speed-Bremse drin, aber sowas sollte leicht zu implentieren sein, und auf aktuellen Systemen läuft das eh viel zu langsam. Wink
 

songokuz

BeitragSa, Aug 21, 2004 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ha. Da hats sehr wohl ne Art Speedbremse drin. Wenn man nämlich das oval beim updaten durch plot austauscht läufts flüssig Razz
P4 2800Mhz mit HT
512MB RAM Infenion
ATI Excalibur Radeon 9600 XT Platinum (256MB,400Mhz) will aber diese wenn sie für Games umgebaut wird Very Happy
 

Timo

BeitragSa, Aug 21, 2004 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Plot ist auch nicht wirklich die schnellste Methode...
@LordChaos: Aber um zu verstehen, wie ne Partikel-Engine funzt, ist es Prima!! Smile

Gruß Timo

maximilian

BeitragSa, Aug 21, 2004 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, wer hat schon Lust, die Farcodes so umzurechnen, dass sie mit WritePixelFast funktionieren (müsste ich wieder mühsam die Blitzbase ansurfen Wink )

Danke fürs Feedback (ich dachte schon, es kommt garnichts mehr).

Grüße,
LordChaos

Travis

BeitragSa, Aug 21, 2004 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ist aber dann 'ne sehr einfache Partikel
Zitat:
Engine


Mann sollte zumindest die Speedwerte beim Erstellen der Partikel angeben können. Dann vielleicht noch die Min-Maxgrößen, Refreshrate und die Farbe.

Und bei 3D-Partikeln natürlich noch die Textur und die Transparenz.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

maximilian

BeitragSa, Aug 21, 2004 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@Travis
Ja, hatte ich eigentlich auch noch vor. Sollte ich mal machen (ist ja auch schön einfach).

Das Wort Engine habe ich auch absichtlich nicht benutzt, obwohl es ursprünglich im File stand.Wink

Grüße,
LordChaos

maximilian

BeitragSa, Aug 21, 2004 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier die neue Version (das einzige was fehlt ist der Timer. hatte es zwar probiert, aber nicht gleich hinbekommen, ohne viele neue Variablen zu brauchen).

BlitzBasic: [AUSKLAPPEN]

;
; 2D-Partikel-"Engine"
;


;--------Partikel-Typ
Type particle1
Field x
Field y
Field radius
Field frame
Field value
Field sort
Field gradient
End Type

Graphics 800, 600, 16, 2
SetBuffer BackBuffer()

Global particle.particle1
Global anz ;--------Anzahl der Partikel
Global value ;--------Partikelgröße

Global sort ;--------aktuelle Partikelart
value=20
Dim sorts$(3) ;--------Partikelarten
sorts$(0) = "Bullet"
sorts$(1) = "Square"
sorts$(2) = "Pixel"
sorts$(3) = "Line"

Global gradient
gradient=0
Dim gradients$(1)
gradients$(0) = "Green"
gradients$(1) = "Fire"


AppTitle "2D-Partikel-'Engine' by LordChaos" ;--------Webung *g*

HidePointer()

While Not KeyDown(1)

Cls

If MouseDown(1) = True Then
anz = anz + 6 ;--------6 Partikel kommen hinzu, aber nur ein Type-Eintrag
CreateParticles(MouseX(), MouseY(), 126) ;-Erstellt eine Partikel-"Explosion"
End If

UpdateParticles() ;--------aktualisiert alle Partikel-"Explosionen"

Color 255, 255 ,255
Oval MouseX(), MouseY(), 10, 10

Text 0, 0, "Partikelanzahl: "+anz ;---Anzahl
Text 0, 12, "Partikelgröße (+/-): "+value ;---Größe
Text 0, 24, "Partikelart (1/2/3/4): "+sorts$(sort) ;---Art
Text 0, 36, "Farbverlauf (G/L): "+gradients$(gradient) ;---Farbverlauf

;-------diverse Kontrollen
If KeyDown(74) Then value = value - 1
If KeyDown(78) Then value = value + 1

If KeyDown(2) Then sort = 0
If KeyDown(3) Then sort = 1
If KeyDown(4) Then sort = 2
If KeyDown(5) Then sort = 3

If KeyDown(34) Then gradient = 0
If KeyDown(38) Then gradient = 1

Flip


Wend

End

Function CreateParticles(pos_x, pos_y, radius)

particle = New particle1

particle\x = pos_x
particle\y = pos_y
particle\radius = radius
particle\value = value
particle\sort = sort
particle\gradient = gradient

End Function

Function UpdateParticles()

For particle = Each particle1

;--------Farbverlauf
If particle\gradient = 0 Then Color 0, 255-particle\frame*2, 0
If particle\gradient = 1 Then Color 255-particle\frame,255-particle\frame*2,0

For a = 1 To 360 Step 64 ;--------so kleiner der Step-Wert, desto mehr Partikel
;--------der Partikel-Zähler muss korrigiert werden

;--------Punkte werden berechnet (simpel, sogar ich hab das mit Sin/Cos hinbekommen,
;--------obwohl ich es noch nicht in der Schule hatte)
x = Sin(a) * particle\frame
y = Cos(a) * particle\frame
x1 = Sin(a) * (particle\frame + value/2) ;---Linien sehen kürzer besser aus :)
y1 = Cos(a) * (particle\frame + value/2) ;

;--------Partikel zeichnen
If particle\sort=0 Then Oval particle\x + x, particle\y + y, value, value
If particle\sort=1 Then Rect particle\x + x, particle\y + y, value, value
If particle\sort=2 Then Plot particle\x + x, particle\y + y
If particle\sort=3 Then Line particle\x + x, particle\y + y, particle\x + x1, particle\y + y1

Next

;--------Eintrag löschen
particle\frame = particle\frame + 1
If particle\frame > particle\radius Then Delete particle: anz = anz - 6



Next


End Function


Momentan recht unordentlich gemacht, ich sollte die Partikelinformationen irgendwie in externe Dateinen verklagern oder so, statt in den Funktionen abzufragen, aber dann werde ich eh wahrscheinlich auf 3d-sprites umstellen, da sich das sonst nicht lohnt.

Grüße,
LordChaos

PS: Könnte sich das nicht eh jeder selbermachen? Confused

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group