AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Andorra 2D - Partikelsysteme
Tutorial durchsuchen
Ansicht
Themen-Optionen

Andorra 2D - Partikelsysteme

Ein Tutorial von igel457 · begonnen am 24. Feb 2007 · letzter Beitrag vom 28. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von igel457
igel457
Registriert seit: 31. Aug 2005
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]
"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
 
Ricoo
 
#2
  Alt 2. Jul 2008, 14:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#3
  Alt 11. Jul 2008, 18:47
PNGDelphi wurde anscheinend von CodeGear aufgekauft. Im Prerequisten-Package von Andorra 2D findest du die letzte freie Version.
Andreas
  Mit Zitat antworten Zitat
n1ghtSurfer

 
Delphi 7 Enterprise
 
#4
  Alt 6. Dez 2008, 16:20
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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#5
  Alt 6. Dez 2008, 20:54
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.
Andreas
  Mit Zitat antworten Zitat
n1ghtSurfer

 
Delphi 7 Enterprise
 
#6
  Alt 9. Dez 2008, 15:10
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
Angehängte Dateien
Dateityp: rar particelsystem_167.rar (1,22 MB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#7
  Alt 9. Dez 2008, 15:19
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...
Andreas
  Mit Zitat antworten Zitat
mimi

 
FreePascal / Lazarus
 
#8
  Alt 5. Jan 2009, 14:47
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.
Michael Springwald
  Mit Zitat antworten Zitat
Benutzerbild von Spiderpig_GER_15
Spiderpig_GER_15

 
Delphi 7 Personal
 
#9
  Alt 28. Mär 2009, 00:06
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 ) diesem Tad2dBitmap kein Bild zuweisen.

Kann mir jemand helfen?

Dankeschön!
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#10
  Alt 28. Mär 2009, 11:07
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.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 Uhr.
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