Einzelnen Beitrag anzeigen

Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 

Andorra 2D - Partikelsysteme

  Alt 24. Feb 2007, 16:44
Das Tutorial befindet sich in der Originalversion hier
Nachdem des Shellserver von SF endlich wieder geht, hier, wie versprochen, das Tutorial zum Thema Partikelsysteme.

Andorra 2D Tutorials
Partikel Systeme


Was sind Partikelsysteme?
Oftmals möchte man in seinem Spiel graphische Effekte wie z.B. Explosionen und Zauber darstellen.
Dazu verwendet man oftmals so genannte "Partikelsysteme". Wie der Name schon sagt, bestehen Partikelsysteme aus einzelnen "Partikeln". Diese wiederum bestehen meistens aus einem eher unspektaktulär aussehendem Bild, das sich in eine bestimmte Richtung bewegt und nach einiger Zeit wieder verschwindet:
http://andorra.sourceforge.net/tutots/particle.png
Hat man nun mehrere dieser "Partikel" so ergibt sich der entsprechende Effekt:
http://andorra.sourceforge.net/tutots/part1.png
Das Partikelsystem kümmert sich also um die Partikel und deren Bewegungen.

Partikelsysteme in Andorra 2D

Das Laden von Partikeln
In Andorra 2D gibt es nun die Klasse "TAdParticleSystem" aus der Unit "AdParticles".
Die Klasse erwartet im Konstruktor einen Parameter des Typs "TAdDraw", der die Oberfläche spezifiziert auf der die Ausgabe stattfinden soll.
Um nun Partikel zu erzeugen muss dem Partikelsystem ersteinmal das Bild des Partikels zugewiesen werden.
Dies geschieht durch folgenden Code:
Delphi-Quellcode:
//Erzeugen des Partikelsystems
partsys := TAdParticleSystem.Create(AdDraw);
//Zuweisen des Bildes
partsys.Texture := AdImageList.Items[0].Texture;
Damit die Ausgabe bestmöglich aussieht achten Sie darauf, das der Partikel einen Alphachannel besitzt. Verwenden Sie zum Beispiel dieses Bild (denken Sie daran, dass Sie zum Laden von PNGs die Unit AdPng einbinden müssen und sich auch die Bibliothek PNGDelphi im Suchpfad befinden muss).

Nun wären wir eigentlich schon fast fertig. Fügen Sie Ihrer Renderroutine die folgende Zeile hinzu:
partsys.CreateParticles(1,TAdParticle,0,0); Diese Zeile fügt dem Partikelsystem einen neuen Partikel des Typs "TAdParticle" hinzu. Das Partikelsystem enthält ein eigenes Koordinatensystem in dem sich die Partikel bewegen. Wir erzeugen unseren neuen Partikel am Koordinatenursprung.

Nun müssen wir dem Partikelsystem nur noch sagen, dass es seine Partikel bewegen und zeichnen soll. Dies geschieht über folgende Zeilen:
Delphi-Quellcode:
PartSys.Move(AdPerCounter.TimeGap / 1000);
partsys.Draw(AdDraw.DisplayRect.Right / 2, AdDraw.DisplayRect.Bottom / 2);
Der Koordinatenursprung des Koordinatensystems wird hierbei temporär auf die Bildschirmmitte verschoben, sodass auch neue Partikel dort erscheinen.
Vergessen Sie nicht das Partikelsystem am ende wieder frei zu geben und führen Sie das Programm aus:
http://andorra.sourceforge.net/tutots/part3.png

Wenn Sie den Sourcecode habe möchten, schauen Sie sich mal die Demo "demos\Particles\Simple\simplepart" an. Oder schauen Sie einfach hier: http://andorra.cvs.sourceforge.net/a...iew=markup#l_1

Das Verhalten von Partikeln
Wie Sie gesehen haben, haben die Partikel schon ein Standardverhalten. Doch woher kommt dieses?
Dazu schauen wir uns die Funktionsweise der "CreateParticle" Funktion des Partikelsystems einmal genauer an:
http://andorra.sourceforge.net/tutots/creation.png
Dabei wird zu beginn die spezifizierte Menge an Partikeln erzeugt, die ihre Eigenschaften von einem "DefaultParticle" des Particlesystems übernehmen. Dann wird die Funktion "Setupmovement" jedes einzelnen Partikels aufgefrufen in der ein Bewegungsvektor generiert wird.
Um also das gesamte aussehen des Partikelsystems zu verändern, müssen Sie nur die Eigenschaften des "DefaultParticle" anpassen. Um zu Beispiel die Lebenszeit der Parikel anzupassen, schreiben Sie:
PartSys.DefaultParticle.LifeTime := 2; //Angabe in Sekunden Sie können die Eigenschaften der Partikel mit dem komfortablen Partikel Editor (parted.exe) anpassen. Spielen Sie einfach ein wenig damit herum. Dort können Sie die Partikel auch in eine Datei schreiben und mit
PartSys.DefaultParticle.LoadFromFile('particle.apf'); wieder hereinladen. Beachten Sie, das das Bild, welches Sie im Partikeleditor hereingeladen haben nicht in der Datei gespeichert wird!
Außerdem verwendet der Partikeleditor das Bild, welches Sie hereinladen noch einmal als Alphachannel. Um dieses Verhalten zu erreichen, müssen Sie folgendes tun:
Delphi-Quellcode:
var
  bmp:TBitmap;
  adbmp:TAdBitmap;
begin
  .
  .
  //Bitmaps erzeugen und Bild laden
  bmp := TBitmap.Create;
  bmp.LoadFromFile('particle.bmp');
  adbmp := TAdBitmap.Create;
  
  //Bitmap als Farb-Bitmap und Alphachannel verwenden
  adbmp.AssignBitmap(bmp);
  adbmp.AssignAlphaChannelFromBitmap(bmp);
  
  //Bild erzeugen
  with AdImageList.Add('particle') do
  begin
    Texture.Texture.LoadFromBitmap(adbmp);
    Restore;
  end;
  
  adbmp.Free;
  bmp.Free;
  .
  .
end;
Das war eigentlich schon alles was es zum Thema Partikel zu sagen gibt.

Eigene Partikelklassen
Wenn Sie zum Beispiel Partikel mit chaotischem Bewegungsmuster erzeugen wollen, können Sie sich eine eigene Partikelklasse ableiten, die Sie dann in CreateParticles angeben können. Dazu stehen Ihnen folgende virtuelle Mehtoden zur Verfügung:
Delphi-Quellcode:
//Hier werden die Bewegungen festgelegt.
procedure DoMove(TimeGap:double);virtual;
//Zeichnet den Partikel
procedure DoDraw(AX,AY:double);virtual;
//Wird aufgerufen, bevor die Partikel gezeichnet werden. Kann z.B. verwendet werden um eine Hintergrundmaske zu zeichnen.
procedure DoPreDraw(AX,AY:double);virtual;

//Wird aufgerufen, wenn der Partikel "getötet"/freigegeben werden soll.
procedure Dead;virtual;

//Wurde schon oben besprochen.
procedure SetupMovement;virtual;
Partikel in der Spriteengine
Um Partikelsysteme in der Spriteengine verwenden zu können gibt es die Klasse "TParticleSprite". Diese besitzt ein eigenes Partikelsystem. Außerdem können Sie einstellen, wie viele Partikel in der Sekunde erzeugt werden sollen.
Dies ist aber nochmal ein eigenes Kapitel und wird dann in den SpriteEngine Tutorials gesondert beschrieben.

Copyright und Lizenz
(c) by Andreas Stöckel Februar 2007

Der Inhalt dieses Tutorials steht unter der GNU Lizenz für freie Dokumentation.

[edit=Matze]Tutorial aktualisiert (27.12.07). MfG, Matze[/edit]
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat