# Partikel

## Was brauche ich?

- ein Bild, welches den Partikel darstellt.
- einen Startpunkt, an dem die Partikel entstehen sollen.
- eine Funktion, die beschreibt wie das Partikelteilchen sich verändern soll.
- eine Funktion, die das Partikelteilchen definiert.
- eine Aktion oder Funktion, die den Partikelgenerator startet.

Jedem Partikel wird eine Funktion zugewiesen wird. Diese wird bei jedem Frame abgearbeitet. In diesem Beispiel, wird nach einmaligen Durchlauf der Funktion, diese durch eine andere ersetzt. Da Funktionen erst aufgerufen werden können, wenn sie definiert worden sind, ist die Reihenfolge wie folgt:

Das Bild sollte möglichst klein sein und durch einen schwarzen Hintergrund keine Außenränder erkennen lassen. Dieses definiert man am besten gleich zu Anfang des Skriptes.

`

    bmap punkt_bmap = <punkt.bmp>;

`

Es sollte eigentlich klar sein, dass die Datei "punkt.bmp" sich entweder im Projektverzeichnis oder in einem mit den Path-Befehl eingebunden Verzeichnis befindet.

Für den Startpunkt eignet sich hervorragend ein Objekt. Wenn keines am Ort ist, kann man dort einfach ein durchsichtiges Objekt plazieren.

Nach dem Erzeugen eines Partikels haben wir unzählige Möglichkeiten, diesen zu beeinflussen. Dies geschieht durch eine Funktion.

`

    function partikel_alphafade()
    {
    	my.alpha -= time;
    	if (my.alpha <= 0) { my.lifespan = 0;}
    }

`

Nach jedem Frame wird diese Funktion von jedem Partikel aufgerufen. Aus diesem Grund erklärt sich auch, das diese nicht sehr rechnerintensiv sein sollte. In diesem Beispiel sorgt die Funktion dafür, dass der Alpha-Wert des Partikels bei jedem Frame heruntergezählt und hierdurch letztendlich durchsichtig wird. Ist der Partikel durchsichtig, wird die Variable "lifespan" auf Null gesetzt.

Normaler Weise wird die Variable "lifespan" bei jedem Frame automatisch heruntergezählt und bei erreichen des Wertes null, wird der Partikel entfernt. Dies machen wir uns zu nutze und setzen diese Variable auf null, wenn der Partikel durchsichtig ist.

Nun fehlt noch eine Funktion, die den Partikel definiert.

`

    function partikel_definieren()
    {
    	my.vel_x = random(2) - 1;
    	my.vel_y = random(2) - 1;
    	my.vel_z = random(2) - 1;
    	vec_normalize(my.vel_x, 8);
    	my.alpha = 100;
    	my.bmap = punkt_bmap;
    	my.function = partikel_alphafade;
    }

`

Nach Aufruf dieser Funktion werden in die Variablen vel_x, vel_z und vel_z per Zufall je eine Zahl zwischen -1 und +1 gesetzt. Durch den Befehl "vec_normalize" wird dann dieser Vektor auf eine einheitliche Länge gebracht. Sollen sich die Partikel nicht gleichmässig in alle Richtungen ausbreiten, so muss nur in der entsprechenden Achse die Formel abgeändert werden.

Alles was jetzt noch fehlt, ist der Befehl, der die Partikel erzeugt.

`

    action partikel
    {
    	while(1)
    	{
    		effect(partikel_definieren, 30, my.x, nullvector);
    		wait(50);
    	}
    }

`

Wie in diesem Beispiel werden durch den Effect-Befehl 30 Partikel erzeugt, die alle die Funktion "partikel_definieren" aufrufen, an der Position "my" starten und zu Anfang als Richtungsvektor den "nullvector" erhalten. Durch die While-Schleife werden hierdurch alle 50 Frames, 30 Partikel erzeugt. Diese Aktion können wir jetzt einem Objekt zuordnen.

Eine weitere sinnvolle Möglichkeit diesen Befehl anzuwenden ist, das Aufrufen des Effect-Befehls durch eine Event-Funktion. Hierdurch können wir auf bestimmte Ereignisse mit dem Partikelgenerator reagieren und haben so auch die Möglichkeit, den Partikelgenerator wieder zu stoppen.