Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Andorra 2D - Partikelsysteme (https://www.delphipraxis.net/87182-andorra-2d-partikelsysteme.html)

igel457 24. Feb 2007 16:44


Andorra 2D - Partikelsysteme
 
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:
Delphi-Quellcode:
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:
Delphi-Quellcode:
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
Delphi-Quellcode:
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]

Ricoo 2. Jul 2008 13:59

Re: Andorra 2D - Partikelsysteme
 
ein großes lob für die tutorials. gut geschrieben und daher einfahc nach zu vollziehen. =)

eine frage zu pngdelphi hätte ich aber noch.
bin ich nur zu doof den downloadlink zu finden oder ist die seite irgentwie nicht mehr ganz aktuell? auf dem link werde ich zu "iGTD" weitergeleitet.

igel457 11. Jul 2008 17:47

Re: Andorra 2D - Partikelsysteme
 
PNGDelphi wurde anscheinend von CodeGear aufgekauft. Im Prerequisten-Package von Andorra 2D findest du die letzte freie Version.

n1ghtSurfer 6. Dez 2008 15:20

Re: Andorra 2D - Partikelsysteme
 
Jop du findest es aber auch bei Google =)

Aber ich hab ma ne andere Frage und zwar dieser Partikel Edito PartEd.exe funkt i-wie bei mir nit er sagt die ganze Zeit:
Zugriffsverletzung bei Addresse 0000000. Lesen von Addresse 0000000
Wenn ich Okay klicke kommt es wieder.
Weiß einer woran das liegt?
MfG
N1GhtSurfer

igel457 6. Dez 2008 19:54

Re: Andorra 2D - Partikelsysteme
 
Zitat:

Zitat von n1ghtSurfer
Weiß einer woran das liegt?

Ja, nicht vollständige OpenGL-Untersützung. Diese "Fehler" ist aber in der CVS-Version behoben.

Momentaner Workaround: Kopiere die AndorraDX93D.dll und die zugehörige dx3d9_31.dll in das Verzeichnis der PartEd.exe und benenne die AndorraDX93D.dll in AndorraOGL.dll um.

n1ghtSurfer 9. Dez 2008 14:10

Re: Andorra 2D - Partikelsysteme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe noch ein Problem, ich bin hier voll am ausrasten weil ich schon seit 2 Tagen den Fehler suche.
Alles funktioniert wunderbar so wie es im Tut steht, doch wenn ich die Anwendung schließe kommt immer:

"Zugriffsverletzung bei Addresse 00467273 in Modul 'Project1.exe'. Lesen von Addresse 00EE8E30."

Ich verwende DirectX und nicht OpenGl aber es will einfach nit funken obwohl der Quellcode exact der selbe ist wie in den Demos aber da funkt es.
Ich hoffe mir kann einer helfen.
MfG
N1GhtSurfer

igel457 9. Dez 2008 14:19

Re: Andorra 2D - Partikelsysteme
 
Du machst nicht alles wie in den Demos...

Du gibst PartSys nach AdDraw frei - das führt zu dem Fehler. PartSys möchte nämlich noch ein Surface-Event-Callback beim AdDraw finalisieren, was aber nicht funktioniert, da das AdDraw nicht mehr existiert.

PS: Das verwenden des Debuggers hätte dir das selbe gezeigt...

mimi 5. Jan 2009 13:47

Re: Andorra 2D - Partikelsysteme
 
mir sind leider zwei kleine Fehler aufgefallen:
zum einen gibt es die Datei http://andorra.sourceforge.net/images/part2.png nicht
Zum anderen hast du in einer Zeile die Parameter vertauscht:
Delphi-Quellcode:
FALSCH
partsys.Draw(bmAdd, AdDraw.DisplayRect.Right / 2, AdDraw.DisplayRect.Bottom / 2);
RICHTIG
partsys.Draw(AdDraw,AdDraw.DisplayRect.Right / 2, AdDraw.DisplayRect.Bottom / 2,bmAdd);
Sonst wirklich gut, es läuft sogar unter Linux. Zur Zeit gehe ich die Tutorials durch weil ich ein Projekt plane wo ich zum erstenmal Andorra einsetzten möchte.

Spiderpig_GER_15 27. Mär 2009 23:06

Re: Andorra 2D - Partikelsysteme
 
Ich habe ein Problem mit TAdBitmap

a) Das gibst nicht mehr, wenn ich mich nicht irre
b) das wurde vermutlich durch Ad2dBitmap ersetzt, das hat aber keine AssignBitmap methode mehr, also man kann (zumindestens ich :D) diesem Tad2dBitmap kein Bild zuweisen.

Kann mir jemand helfen?

Dankeschön!

igel457 28. Mär 2009 10:07

Re: Andorra 2D - Partikelsysteme
 
TAdBitmap in der Unit AdBitmap gibt es natürlich noch. Diese Klasse ist von TAd2DBitmap abgeleitet und erweitert diese um die von dir vermissten Lade und Assign Methoden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz