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 += 10

Weiterfü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 dir

Effekte 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), // Position
=== im Editor einem Modell zuweisen ===

noch 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)