Partikel Engine
Übersicht
BlitzBasic
Codearchiv|
|
joKeBetreff: Partikel Engine |
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 |
Antworten mit Zitat |
|---|---|---|
|
Hübsch, aber imho kein Tutorial...
VERSCHOBEN INS CODEARCHIV |
||
| MrKeks.net | ||
|
|
Jolinah |
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? Nur nen Vorschlag, vielleicht würde es das ganze ja auch langsamer machen, ich hab sowas noch nie versucht |
||
|
|
joKe |
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 |
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 |
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 |
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
