Partikel Engine
Übersicht BlitzBasic Codearchiv
joKeBetreff: Partikel Engine |
Mo, Feb 09, 2004 11:41 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Feb 09, 2004 14:56 Antworten mit Zitat |
|
---|---|---|
Hübsch, aber imho kein Tutorial...
VERSCHOBEN INS CODEARCHIV |
||
MrKeks.net |
Jolinah |
Mo, Feb 09, 2004 15:03 Antworten mit Zitat |
|
---|---|---|
Find ich super
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? 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 |
||
joKe |
Mo, Feb 09, 2004 17:30 Antworten mit Zitat |
|
---|---|---|
Hmmm gute Frage ich werds mal testen | ||
Projekt: Pollux Renegades Coop
[Maschine: Intel DualCore2 2x 3Ghz | 4096 DRR2 | GeForce GTX 260 Ultra] |
Sparx |
Mo, Feb 09, 2004 20:51 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Feb 09, 2004 21:20 Antworten mit Zitat |
|
---|---|---|
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] |
BladeRunnerModerator |
Mo, Feb 09, 2004 21:21 Antworten mit Zitat |
|
---|---|---|
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 |
Übersicht BlitzBasic Codearchiv
Powered by phpBB © 2001 - 2006, phpBB Group