effect (function, var number, VECTOR* pos, VECTOR* vel)
effect_local (function, var number, VECTOR* pos, VECTOR* vel)
effect_layer (function, var number, VECTOR* pos, VECTOR* vel)
Mithilfe dieser Anweisung läßt sich ein Schwarm kleiner, sich bewegender
Bitmap-Partikel erstellen,
etwa
um
einen
Raketenschweif,
Explosionen, Laserstrahlen, Photonentorpedos, Regen, Schneestürme, Tornados oder
ähnliches darzustellen. Der Vektor pos gibt dabei die Startposition
des Schwarmes an, number die Anzahl der Partikel, der Vektor
vel entweder Ausgangsgeschwindigkeit oder ursprüngliche
Länge eines Strahls, und function definiert das Verhalten eines
jeden Partikels. Die Funktion muss vorher definiert sein. Sie wird während der
Lebensdauer jedes einzelnen Partikels permanent aufgerufen und kann durch einen
my-Pointer die Position, Geschwindigkeit, Farbe, Größe und Bitmap
des Partikels wie bei einer normalen Entity verändern. Es können sogar neue
'Kinder-'Partikel kreiert werden. Auf diese Weise lassen sich Partikel für alle
denkbaren Effekte verwenden.
|
|
|
|
|
Partikel-Effekt
|
|
Beam-Effekt
|
Parameter:
function |
Partikelfunktion, läuft mit jedem Frame |
number |
Anzahl der zu erstellenden Partikel |
pos |
Position des Partikelemitters |
vel |
Vektor der Ausgangsgeschwindigkeit oder Strahlenlänge |
Bemerkungen:
- Die Partikel werden nicht unmittelbar nach Aufrufen dieser Funktion erstellt,
sondern erst beim Starten des nächsten beim nächsten Render-Zyklus.
- Wird die effect_local-Anweisung auf einem Clienten
in einem Multiplayer-System ausgeführt, werden die Partikel nur auf dem betreffenden
Clienten selbst dargestellt. Wird die effect-Anweisung
auf dem Server ausgeführt, so wird die Anweisung auf allen Clients aufgerufen
und die Partikel dargestellt. In einem Single-Player-System sind beide Anweisungen
identisch.
- A8
Die Funktioneffect_layerer erstellt den Effekt ausserhalb des Levels, ganz so wie layered entities. Auf diese Weise lassen sich Effekte auf Panels platzieren oder können dem Mauszeiger folgen. Partikel, die mit effect_layer erstellt werden, werden auf den media_layer gerendert und benutzen die View-Einstellungen des camera-Views.
- Man kann einige Tausend von Partikeln haben, die Paritkelfunktion sollte
also so schnell und kurz wie möglich sein. wait()-Anweisungen
können in Partikelfunktionen nicht verwendet werden. Lokale Variablen lassen
sich verwenden, werden zwischen Frames aber nicht beibehalten.
- Partikel sind zweidimensional (sie haben keine Winkel) und führen keine Kollisionserkennung durch. Brauchen Sie Winkel oder andere Features, die von Sprites nicht unterstützt werden, nehmen Sie effect_sprites zu Erstellen eines Schwarm an Sprites. Wenn Sie Kollisionserkennung brauchen, ist am schnellsten, den Abstand zu einer Kollisionsfläche innerhalb der Partikelfunktion direkt zu berechnen - idealerweise einer an einer achsenausgerichteten Fläche. Man kann auch c_trace benutzen, allerdings verlangsamt das den Effekt.
- Partikel werden am Ende des Framezyklus' nach allen anderen Objekten gerendert. Das bedeutet, daß transparente Partikel über anderen transparenten Objekten erscheinen. Um dies zu verhindern, können Sie den Partikeln eine nicht-transparente Overlay-Bitmap geben. Müssen Sie transparente Partikel sortieren, verwendetn Sie effect_sprites, um stattdessen einen Schwarm an Sprites zu erstellen.
- Um den Effekt unabbhängig von der Framerate zu halten, sollte in den meisten Fällen die Anzahl an Partikeln in den meisten Fällen mit time_step multipliziert werden (s. Beispiel).
- A7.71 P Die Pro-Edition verwendet "Instancing" zum Erstellen Tausender von Partikeln mit einer einzigen Zeichenfunktion (eine von neuen Grafikkarten unterstützte Methode, viele Kopien deselben Objekts zu rendern). Derart lassen sich bis zu zehn mal mehr Partikel rendern als mit den niedrigeren Editionen. Durch die Variable particle_mode kann man dieses Feature abschalten.
- Mithilfe der Variablen max_particles kann man die Gesamtzahl an Partikeln begrenzen.
Geschwindigkeit:
Schnell
Demo (lite-C):
// helper function: sets the vector to random direction and length
function vec_randomize (VECTOR* vec, var range)
{
vec_set(vec,vector(random(1)-0.5,random(1)-0.5,random(1)-0.5));
vec_normalize(vec,random(range));
}
// helper function: fades out a particle
function p_alphafade(PARTICLE *p)
{
p.alpha -= p.skill_a*time_step;
if (p.alpha <= 0) p.lifespan = 0;
}
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_alphafade;
}
function main()
{
level_load(NULL);
video_window(NULL,NULL,0,"Particle demo");
vec_set(camera.x,vector(-150,0,50));
vec_set(sky_color,vector(50,0,0)); // dark blue
while(1)
{
effect(p_fountain,maxv(1,40*time_step),vector(0,0,0),vector(0,0,5));
wait(1);
}
}
Siehe auch:
lifespan, vel_x, gravity, size, alpha, bmap, event, skills, MOVE, BEAM, ent_decal, particles.c
► Aktuelle Version Online