Partikel-Effekte programmieren ed
einzelne Partikel ed
allgemein ed
Ein Partikel ist ein (2D-) Bild, das in der 3D-Welt herumhängt und immer zur Kamera ausgerichtet ist.
Um das Verhalten eines Partikels festzulegen, kann eine Callback-Funktion beim Erschaffen mitgegeben werden, die regelmäßig ausgeführt wird.
Die Position (xxx.Pos) wird automatisch durch den aktuellen Wert der Geschwindigkeit (xxx.Vel) korregiert. Auch xxx.TimeToLive zählt automatisch nach unten und sobald es negativ wird, wird das Partikel gelöscht.
Partikel ed
Der Variablen-Typ für ein einziges Partikel ist particle.
Beispiel:
class MyParticle : Particle
// Callback-Funktion
overwrite void OnIterate()
// langsam transparenter werden lassen
self.color.a -= elapsed / 4.0
// löschen, wenn es nicht mehr sichtbar ist
// (eigentlich nicht nötig, da es automatisch gelöscht wird...)
if self.color.a < 0
time_to_live = -1
void CreateSomeParticles()
vector pos = vector(100, 100, 100)
int tex = LoadTexture("aaa.tga")
int tex = LoadTexture("aaa.tga")
// einmalig 10 Partikel in einer Reihe erstellen
int i
for i, 0, 10)
// erstellen
particle p = new MyParticle( pos, tex,
5, // lebt 5 sec
10 ) // 10 le Radius
// Start-Werte festlegen
p.Color = Green // gruen faerben
p.Source = rect(0, 1, 0, 0.5) // nur einen Ausschnitt der Textur nehmen
p.Vel = vector(0, 100, 0) // mit 100 le/s nach oben fliegen lassen
pos.x += 10Weiterführend: Ein einfaches Partikel hängt in der Welt und hat immer die selbe Ausrichtung zur Kamera. Will man diese kontrollieren, muss es mit der Funktion CreateParticleRot erzeugt werden. Dadurch wird die Eigenschaft xxx.Ang verwendbar.
Strahlen ed
Strahlen sind auch (2D-) Bilder, die in der 3D-Welt hängen, allerdings werden sie zwischen zwei Punkten im Raum gespannt. Sie eignen sich zum Beispiel für Laser-Strahlen.
Der Variablen-Typ für einen Strahl ist beam.
Beispiel:
void main()
vector pos = vector(100, 100, 100)
vector dir = vector(1, 0, 0)
// Erschaffen
beam b = new Beam( pos,
dir * 200, // Länge = 200, Richtung = dir
LoadTexture("aaa.jpg"), // eine Textur eben
5, // lebt 5 sec
10 ) // Dicke = 10
b.Vel = dir * 1000 // Geschwindigkeit = 1000/s in Richtung dirEffekte ed
allgemein ed
Effekte sind unsichtbare Objekte, die dazu genutzt werden können, regelmäßig Partikel zu emittieren.
Der Variablentyp ist effect.
Beispiel:
class MyParticle : Particle
overwrite void OnIterate()
// ausblenden
self.color.a -= self.elapsed * 0.25
void EffectFunc(effect fx)
// ein Partikel an der Effekt-Position erstellen
particle p = CreateParticle( fx.Pos, -1,
&ParticleFunc,
4, 10 )
class MyEffect : Effect
overwrite void OnIterate()
// ein Partikel an der Effekt-Position erstellen
particle p = new MyParticle( fx.Pos, -1,
4, 10)
// in zufällige Richtung fliegen lassen
p.vel = vector( rand(200) - 100,
rand(200) - 100,
rand(200) - 100 )
-1 ) // bis in alle Ewigkeit
overwrite void OnInit()
// Callback-Funktion nur jede Sekunde aufrufen
func_delta_t = 1.0
fx.Vel = vector(100, 0, 0) // Geschwindigkeit setzen
effect fx = new MyEffect( vector(100, 100, 100), // Positionnoch in der Entwicklung!!!
...
komplizierter ed
Effekte sind nicht nur auf Partikel beschränkt. So können zum Beispiel Lichtquellen oder Geräuschquellen erschaffen werden.
'Das Script und seine globalen Variablen existieren nur einmal im Speicher. D.h. Mehrere Instanzen desselben Effekts teilen sich die globalen Variablen. Deshalb eignen sich diese nicht zum Speichern von Daten, die einem einzelnen Effekt gehören sollen!'
Um einem Effekt weitere Daten anhängen zu können, muss deshalb eine neue Klasse abgeleitet werden, die die zusätzlichen Daten enthält.
CreateParticle(fx.Pos, -1, &ParticleFunc, 5, 10)
...
class MyEffect : Effect
Light *light
int sound
// sie wird dann von der Engine beim Laden des Modells einmalig ausgefuehrt
overwrite void OnIterate()
// die Position der Lichtquelle synchronisieren
light.SetRadial(pos, 10000)
// Geräusch synchronisieren
SoundSetData(sound, pos, vel, 10000, 1.0, 1.0)
void EffectFunc(effect fx)
overwrite void OnEnable(bool enabled)
light.enabled = enabled // nur leuchten, wenn der Effekt aktiv ist
overwrite void OnDelete()
// Licht und Geräusch löschen, falls der Effekt gelöscht wird
delete(light)
SoundDelete(sound)
overwrite void OnInit()
// Lichtquelle erschaffen und im Effekt speichern
light = new Light
light.SetColors(Black, White, Black)
light.SetRadial(pos, 10000)
light.enabled = true
FXLightDelete(fx._light)
SoundDelete(fx._sound)
void Create(vector pos)
effect fx = CreateEffect(pos, &EffectFunc, 20)
// Lichtquelle erschaffen und im Effekt speichern
fx._light = FXLightCreate()
FXLightSetRadial(fx._light, pos, 10000, Black, White, Black)
FXLightEnable(fx._light, true)
// Geräusch erschaffen...
sound = SoundCreate("some_sound.wav")
SoundSetData(sound, pos, v_0, 10000, 1.0, 1.0)