![]() |
Andorra 2D - Partikelsysteme
![]() 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: ![]() Hat man nun mehrere dieser "Partikel" so ergibt sich der entsprechende Effekt: ![]() 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:
Damit die Ausgabe bestmöglich aussieht achten Sie darauf, das der Partikel einen Alphachannel besitzt. Verwenden Sie zum Beispiel
//Erzeugen des Partikelsystems
partsys := TAdParticleSystem.Create(AdDraw); //Zuweisen des Bildes partsys.Texture := AdImageList.Items[0].Texture; ![]() ![]() Nun wären wir eigentlich schon fast fertig. Fügen Sie Ihrer Renderroutine die folgende Zeile hinzu:
Delphi-Quellcode:
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.
partsys.CreateParticles(1,TAdParticle,0,0);
Nun müssen wir dem Partikelsystem nur noch sagen, dass es seine Partikel bewegen und zeichnen soll. Dies geschieht über folgende Zeilen:
Delphi-Quellcode:
Der Koordinatenursprung des Koordinatensystems wird hierbei temporär auf die Bildschirmmitte verschoben, sodass auch neue Partikel dort erscheinen.
PartSys.Move(AdPerCounter.TimeGap / 1000);
partsys.Draw(AdDraw.DisplayRect.Right / 2, AdDraw.DisplayRect.Bottom / 2); Vergessen Sie nicht das Partikelsystem am ende wieder frei zu geben und führen Sie das Programm aus: ![]() Wenn Sie den Sourcecode habe möchten, schauen Sie sich mal die Demo "demos\Particles\Simple\simplepart" an. Oder schauen Sie einfach hier: ![]() 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: ![]() 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:
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.LifeTime := 2; //Angabe in Sekunden
Delphi-Quellcode:
wieder hereinladen. Beachten Sie, das das Bild, welches Sie im Partikeleditor hereingeladen haben nicht in der Datei gespeichert wird!
PartSys.DefaultParticle.LoadFromFile('particle.apf');
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:
Das war eigentlich schon alles was es zum Thema Partikel zu sagen gibt.
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; 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:
Partikel in der Spriteengine
//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; 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 ![]() [edit=Matze]Tutorial aktualisiert (27.12.07). MfG, Matze[/edit] |
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. |
Re: Andorra 2D - Partikelsysteme
PNGDelphi wurde anscheinend von CodeGear aufgekauft. Im Prerequisten-Package von Andorra 2D findest du die letzte freie Version.
|
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 |
Re: Andorra 2D - Partikelsysteme
Zitat:
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. |
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 |
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... |
Re: Andorra 2D - Partikelsysteme
mir sind leider zwei kleine Fehler aufgefallen:
zum einen gibt es die Datei ![]() Zum anderen hast du in einer Zeile die Parameter vertauscht:
Delphi-Quellcode:
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.
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); |
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! |
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.
|
Re: Andorra 2D - Partikelsysteme
Oh, dann habe ich einfach nur vergesen die Unit einzubinden, dankeschön :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz