Partikel Engine

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

joKe

Betreff: Partikel Engine

BeitragMo, Feb 09, 2004 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mal ne kleine Allgemein Einsetzbare PartikelEngine für 2D Spiele programmiert . Sie ist vielleicht nicht die Krönung der Schöpfung aber ich hoffe ein bissl kann man drauß lernen oder sie direkt als Include einsetzten

Code: [AUSKLAPPEN]
Global partikel_count

Type partikel

   Field ID

   Field x#
   Field y#
   
   Field move_x#         ; x# wird mit diesem Wert addiert
   Field move_y#         ; y# wird mit diesem Wert addiert
   
   Field move_x_change#    ; Move_X wird mit diesem Parameter Multipliziert
   Field move_y_change#    ; Move_Y wird mit diesem Parameter Multipliziert
   
   Field typ            ; Gibt die Grafik ID an die das Partikel haben soll
   Field frame            ; Gibt den aktuellen Frame an
   
   Field creationtime
   Field lifetime
   
   ;Field on_end_action
   
   Field ani_lasttime      ; Beinhaltet den Zeitpunkt an dem der PC das letzte
                     ; mal ein Frame weiter geschaltet hat
End Type

Type partikel_gfx

   Field ID
   Field image            ; Hierdrin ist das Partikelbild gespeichert
   Field animated         ; Gibt an ob ein Bild animiert ist
   Field ani_count         ; Gibt die Anzahl der Frames an
   Field ani_time         ; Gibt die Zeitspanne an , die der PC warten soll bis er ein Frame weiterschaltet
   
End Type

;###   

Function LoadPartikelGFX(p_id,p_path$,p_width=0,p_height=0,p_startframe=0,p_framecount=0,p_time=0)

   new_partikel_gfx.partikel_gfx = New partikel_gfx
   new_partikel_gfx\ID    = p_id
   If p_width = 0 Then
      new_partikel_gfx\image     = LoadImage(p_path$)
      new_partikel_gfx\animated    = 0
   Else
      new_partikel_gfx\image       = LoadAnimImage(p_path$,p_width,p_height,p_startframe,p_framecount)
      new_partikel_gfx\animated    = 1
   EndIf
   new_partikel_gfx\ani_count       = p_framecount
   new_partikel_gfx\ani_time      = p_time
   
   If Not new_partikel_gfx\image Then RuntimeError("PartikelLoader can´t load " + p_path$)    
   
End Function

Function SetPartikelGFXProps(p_midhandle,p_mask_r,p_mask_g,p_mask_b)

   new_partikel_gfx.partikel_gfx = Last partikel_gfx
   If p_midhandle = 1 Then MidHandle new_partikel_gfx\image
   MaskImage new_partikel_gfx\image,p_mask_r,p_mask_g,p_mask_b
      
End Function

Function CreatePartikel(p_typ,p_x#,p_y#,p_move_x#=0,p_move_y#=0,p_move_x_change#=0,p_move_y_change#=0,p_lifetime=0)

   partikel_count = partikel_count + 1
   new_partikel.partikel = New partikel
   
   new_partikel\ID          = partikel_count
   new_partikel\typ          = p_typ
      
   new_partikel\x#            = p_x#
   new_partikel\y#            = p_y#
   
   new_partikel\move_x#      = p_move_x#
   new_partikel\move_y#      = p_move_y#
   
   new_partikel\move_x_change#   = p_move_x_change#
   new_partikel\move_y_change#   = p_move_y_change#
   
   new_partikel\creationtime    = MilliSecs()
   new_partikel\lifetime      = p_lifetime
      
End Function   

Function UpdatePartikel(p_id=0)

   Local delpart

   If p_id = 0 Then
      For all_partikel.partikel = Each partikel
         For all_partikel_gfx.partikel_gfx = Each partikel_gfx
            If all_partikel_gfx\ID = all_partikel\typ Then
               If all_partikel_gfx\animated = 1 Then
                  If (MilliSecs() - all_partikel\ani_lasttime) > all_partikel_gfx\ani_time Then
                     all_partikel\ani_lasttime = MilliSecs()
                     all_partikel\frame   = (all_partikel\frame + 1) Mod all_partikel_gfx\ani_count
                  EndIf
               EndIf
               all_partikel\x# = all_partikel\x# + all_partikel\move_x#
               all_partikel\y# = all_partikel\y# + all_partikel\move_y#
               all_partikel\move_x# = all_partikel\move_x# * all_partikel\move_x_change#
               all_partikel\move_y# = all_partikel\move_y# * all_partikel\move_y_change#
               If all_partikel\lifetime <> 0 Then
                  If (MilliSecs() - all_partikel\creationtime) > all_partikel\lifetime Then
                     delpart = 1
                  EndIf
               EndIf         
            EndIf
         Next
         If delpart = 1 Then Delete all_partikel.partikel : delpart = 0
      Next
   Else
      For all_partikel.partikel = Each partikel
         If all_partikel\ID = p_id Then
            For all_partikel_gfx.partikel_gfx = Each partikel_gfx
               If all_partikel_gfx\ID = all_partikel\typ Then
                  If all_partikel_gfx\animated = 1 Then
                     If (MilliSecs() - all_partikel\ani_lasttime) > all_partikel_gfx\ani_time Then
                        all_partikel\ani_lasttime = MilliSecs()
                        all_partikel\frame   = (all_partikel\frame + 1) Mod all_partikel_gfx\ani_count
                     EndIf
                  EndIf
                  all_partikel\x# = all_partikel\x# + all_partikel\move_x#
                  all_partikel\y# = all_partikel\y# + all_partikel\move_y#
                  all_partikel\move_x# = all_partikel\move_x# * all_partikel\move_x_change#
                  all_partikel\move_y# = all_partikel\move_y# * all_partikel\move_y_change#
                  If all_partikel\lifetime <> 0 Then
                  If (MilliSecs() - all_partikel\creationtime) > all_partikel\lifetime Then
                     delpart = 1
                  EndIf
               EndIf   
               EndIf
            Next
         EndIf
         If delpart = 1 Then Delete all_partikel.partikel : delpart = 0
      Next
   EndIf
   
End Function   

Function DrawPartikel(p_id=0)

   If p_id = 0 Then   
      For all_partikel.partikel = Each partikel
         For all_partikel_gfx.partikel_gfx = Each partikel_gfx
            If all_partikel\typ = all_partikel_gfx\ID Then
               If all_partikel_gfx\animated = 0 Then
                  DrawImage all_partikel_gfx\image,all_partikel\x#,all_partikel\y#
               Else
                  DrawImage all_partikel_gfx\image,all_partikel\x#,all_partikel\y#,all_partikel\frame
               EndIf
            EndIf
         Next
      Next
   Else
      For all_partikel.partikel = Each partikel
         If all_partikel\ID = p_id Then
            For all_partikel_gfx.partikel_gfx = Each partikel_gfx
               If all_partikel\typ = all_partikel_gfx\ID Then
                  If all_partikel_gfx\animated = 0 Then
                     DrawImage all_partikel_gfx\image,all_partikel\x#,all_partikel\y#
                  Else
                     DrawImage all_partikel_gfx\image,all_partikel\x#,all_partikel\y#,all_partikel\frame
                  EndIf
               EndIf
            Next
         EndIf   
      Next
   EndIf
   
End Function



Hier noch eine kleine Erklärung der Functions :

Zitat:
(o) = optional

### LoadPartikelGFX(id,path$,width,height,startframe,framecount,time)

id = Du kannst jedem Partikel Typen eine ID zuweisen , damit du nachher
bei CreatePartikel -> Typ aussuchen kannst , welche Partikelart
du erstellen lassen willst.
path$ = Gibt den Pfad der Grafikdatei an
width(o) = Falls du animierte Partikel haben willst musst du hier wie bei
LoadAnimImage Breite ( und Hoehe ) der einzelnen Frames angeben.
height(o) = Falls du animierte Partikel haben willst musst du hier wie bei
LoadAnimImage ( Breite und ) Hoehe der einzelnen Frames angeben.
startframe(o) = Wenn du animierte Partikel haben möchtest , musst du hier den
Startframe angeben aus dem Bild.
framecount(o) = Wenn du animierte Partikel haben möchtest , musst du hier die
Anzahl der Frames angeben , die die Animation umfasssen soll.
time(o) = Gibt die Zeit in Millisekunden an , die das Programm warten soll
bis er einen Frame weiterschaltet




### SetPartikelGFXProps(midhandle,mask_r,mask_g,mask_b)

Diese Funktion muss direkt nach LoadPartikelGFX ausgeführt werden
damit sie auf das jeweils letzt definierte Partikel Auswirkungen hat.

midhandle = ( 0 = Kein MidHandle // 1 = MidHandle )
mask_r(o) = Wenn du Masken willst ist das der Rot Anteil
mask_g(o) = Wenn du Masken willst ist das der Gelb Anteil
mask_b(o) = Wenn du Masken willst ist das der Blau Anteil




### CreatePartikel(typ,x,y,move_x,move_y,move_x_change,move_y_change,p_lifetime)

typ = Gibt den PartikelTypen an , also die Partikel ID die
bei LoadPartikelGFX gesetzt wurde.
x = Der X Wert an dem es erstellt werden soll
y = Der Y Wert an dem es erstellt werden soll
move_x(o) = Der Wert der zu dem X Wert addierten werden soll jeden Durchgang
move_Y(o) = Der Wert der zu dem Y Wert addierten werden soll jeden Durchgang
move_x_change(o)= Der Wert mit dem move_x multiplziert werden soll
move_y_change(o)= Der Wert mit dem move_y multiplziert werden soll
lifetime(o) = Wie lange der Partikel Leben soll in Millisekunden



### UpdatePartikel(id)

id ist optional , default = 0

Muss in der Main Loop Schleife stehen damit die Partikel immer geupdated werden
wenn ID leer ist oder 0 dann werden alle geupdatet sonst nur der Partikel mit
dieser ID.



### DrawPartikel(id)

id ist optional , default = 0

Muss in der Main Loop Schleife stehen damit die Partikel immer gemalt werden
wenn ID leer ist oder 0 dann werden alle gemalt , sonst nur der Partikel mit
dieser ID.



den Download des SourceCodes mit einer kleinen Demonstration gibts hier :

http://home.arcor.de/bgbnb_j0k3/PartikelEngine.zip
Projekt: Pollux Renegades Coop
[Maschine: Intel DualCore2 2x 3Ghz | 4096 DRR2 | GeForce GTX 260 Ultra]

Mr.Keks

BeitragMo, Feb 09, 2004 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hübsch, aber imho kein Tutorial...

VERSCHOBEN INS CODEARCHIV
MrKeks.net

Jolinah

BeitragMo, Feb 09, 2004 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Find ich super Wink

Aber kleine Frage:

Field typ --> Field typ.partikel_gfx

Und dann zu dem Objekt direkt linken, könnte das nicht noch nen kleinen Speed vorteil bringen? Wink Dann wären die For each schleifen für die partikel_gfx weg.

Nur nen Vorschlag, vielleicht würde es das ganze ja auch langsamer machen, ich hab sowas noch nie versucht Wink

joKe

BeitragMo, Feb 09, 2004 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm gute Frage ich werds mal testen
Projekt: Pollux Renegades Coop
[Maschine: Intel DualCore2 2x 3Ghz | 4096 DRR2 | GeForce GTX 260 Ultra]

Sparx

BeitragMo, Feb 09, 2004 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
j0k3 hat Folgendes geschrieben:
Field move_x_change# ; Move_X wird mit diesem Parameter Multipliziert
Field move_y_change# ; Move_Y wird mit diesem Parameter Multipliziert


Was soll das(Wieso sollte man Move_x mit irgendeinem wert Multiplizieren)?
User posted image

joKe

BeitragMo, Feb 09, 2004 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man es zB mit 0.5 multiplziert wird das fliegen immer langsamer , damit zB Gesteinsbrocken oder Patronen richtig dargestellt werden können , die ja logischerweise irgendwann anhalten
dazu muss man das Move_X und Move_Y irgendwie verändern können oder ?
Projekt: Pollux Renegades Coop
[Maschine: Intel DualCore2 2x 3Ghz | 4096 DRR2 | GeForce GTX 260 Ultra]

BladeRunner

Moderator

BeitragMo, Feb 09, 2004 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
sagt schon der variablenname:
um die Bewegungsschritte eines Partikels zu ändern (zB zunehmend y für einwirken der Gravitation.)

EDIT: MIst .... zu spät
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group