particles.c
Diese Include-Datei enthält oft verwendete kleine Partikel-Funktionen wie etwa das Emulieren eines Partikeleffektes mit Sprites. Die Funktionen sind einfach genug, um auf den ersten Blick verstanden zu werden. Wenn Sie sie verändern wollen, editieren Sie bitte eine Kopie von particles.c in Ihrem Work-Ordner und nicht die Originaldatei im include-Ordner.
effect_sprite(STRING* image, EVENT func, var number, VECTOR* pos, VECTOR* vel)
Emuliert einen effect_local ähnlichen Partikeleffekt, jedoch mit Sprites (oder Modellen) anstelle von Partikeln.
Parameter:
image |
STRING* oder char*; Sprite- oder Modell-Dateiname des Partikels, oder NULL für einen Default-Partikel. |
func |
Partikelfunktion, läuft jeden Frame. |
number |
Anzahl der zu erstellenden Partikel. |
pos |
Position desPartikel-Emitters. |
vel |
Anfangs-Geschwindigkeitsvektor. |
Bemerkungen:
- Vorteil der Partikel-Emulation: Sprites oder Modelle können beliebige Größen und Orientierungen haben, werden, wenn transparent, nach Abstand sortiert und können, wenn gewünscht, Kollisionserkennung durchführen. Zudem sind Shader möglich. Nachteil: Rendern und vor allem Erstellen von Sprites oder Modellen ist viel langsamer als das Rendern und Erstellen von Partikeln.
- Die emulierte Partikelfunktion (func) sieht fast genauso wie eine normale Partikelfunktion aus, allerdings werden einige partikel-spezifische Parameter und Flags durch Entity-Skills skill60..69 und FLAG7 ersetzt (s. Beispiel unten): vel_x/y/z => _VEL_X/Y/Z; gravity => _GRAVITY; size => _SIZE; lifespan => _LIFESPAN; you => _CREATOR; MOVE => _MOVE. BEAM und STREAK werden nicht unterstützt.
- Jeder emulierte Partikel generiert während seiner Lebensspanne eine zusätzliche Funktion im Scheduler. Wenn nötig, passen Sie max_entities und nexus an.
Beispiel:
#include <acknex.h>
#include <default.c>
#include <particles.c>
// original particle function
function p_fountain(PARTICLE* p)
{
VECTOR vTemp;
vec_randomize(vTemp,2);
vec_add(p.vel_x,vTemp);
vec_set(p.blue,vector(random(255),random(255),255));
set(p, MOVE | BRIGHT | TRANSLUCENT);
p.alpha = 100;
p.size = 2;
p.gravity = 0.2;
p.skill_a = 3; // fade factor
p.event = p_fade;
}
// sprite-emulated particle function
function p_fountain_sprite(ENTITY* p)
{
VECTOR vTemp;
vec_randomize(vTemp,2);
vec_add(p._VEL_X,vTemp);
vec_set(p.blue,vector(random(255),random(255),255));
set(p, _MOVE | BRIGHT | TRANSLUCENT);
p.alpha = 100;
p._SIZE = 2;
p._GRAVITY = 0.2;
p._FADE = 3; // fade factor
p.event = p_fade_sprite;
}
function main()
{
max_entities = max_particles;
level_load(NULL);
vec_set(camera.x,vector(-150,0,50));
while(1)
{
if (key_s) // emulated particles
effect_sprite(NULL,p_fountain_sprite,maxv(1,20*time_step),vector(0,0,0),vector(0,0,5));
else // original particles
effect(p_fountain,maxv(1,20*time_step),vector(0,0,0),vector(0,0,5));
wait(1);
}
}
vec_randomize (VECTOR* vec, var range)
Setzt einen Vektor auf eine zufällige Länge und Ausrichtung; nützlich für Partikelexplosionen (s. Beispiel oben).
Parameter:
vec - Vektor, der auf Zufallswerte gesetzt werden soll.
range - maximum vector length.
Modifiziert:
vec
p_fade (PARTICLE* p);
p_fade_sprite (ENTITY* p);
Blendet einen durchscheinenden Partikel bzw. emulierten Partikel aus und entfernt ihn sobald er komplett durchsichtig ist. Die Blendgeschwindigkeit läßt sich über den skill_a-Parameter bzw. den Parameter _FADE des Partikels angeben (s. Beispiel oben).
p_follow (PARTICLE* p);
p_follow_sprite (ENTITY* p);
Läßt einen Partikel der erstellenden Entity folgen. Verwendet skill_x/_y/_z bzw. entity skill70..72.
p_snow (PARTICLE* p)
Läßt einen Partikel langsam zu Boden fallen, wie eine Schneeflocke. Windgeschwindigkeit und -Richtung werden mit vel_x/_y/_z vorgegeben. Der Partikel wird an eine Zufallsposition am oberen Ende des camera Viewkegels plaziert und automatisch entfernt, wenn er das untere Ende erreicht. skill_z wird benutzt.
Beispiel: Siehe samples\weather.c
Siehe auch:
effect
► latest
version online