Autor Beitrag
Dibelius
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 26.05.06 19:24 
Hallo,

ich will für ein Spiel ein Programm schreiben, mit dem es möglich ist, Partikeleffekte für dieses Spiel zu erzeugen. Das Spiel arbeitet mit INI-Dateien, in denen man fast alles ändern kann - neue Einheiten für Parteien im Spiel, Waffen, Effekte, Sounds usw. Das alles kann man über die INI-Dateien modifizieren.

Da es aber ziemlich unvorteilhaft ist, nur mit blankem Code zu arbeiten, wenn man Partikeleffekte erzeugen will, wollte ich dafür ein Programm schreiben, wo man sämtliche Einstellungen aus entsprechender Effekt-INI zur Verfügung hat. Die Werte für alle diese Einstellungen soll man über das Programm ändern können und in einem Vorschaubildschirm soll das Partikelsystem mit den aktuellsten Werten abgespielt werden, wenn man einen Button drückt. Zusätzlich soll ein Koordinatensystem bei Bedarf ein-/ausgeblendet werden können, um die Größenverhältnisse des Effektes zu erkennen.

Nun, nachdem man alle Einstellungen so hat wie man will, soll das Programm bei einem Klick auf einen Generieren-Button alle Code-Zeilen so aufbereiten, dass sie formatiert (also eingerückt) und in bestimmter Reihenfolge in einem Memo-Feld ausgegeben werden, damit man den Code nur noch in die eigentliche INI-Datei zu kopieren braucht. Ausgegeben werden sollen alle Anweisungen und die dazugehörigen Werte, die man mit dem Programm vorher erstellt hat.

Das kann zb. so aussehen:

Zitat:
ParticleSystem NameOfParticleSystem
..Priority = CRITICAL
..Shader = ADDITIVE
..Type = PARTICLE
..ParticleName = Texture.tga
..Lifetime = 10.00 10.00
..Size = 1.00 1.00
..Alpha1 = 1.00 1.00 0
..Color1 = R:255 G:255 B:255 0
..ColorScale = 0.00 0.00
..IsHollow = Yes
..IsGroundAligned = No
..IsEmitAboveGroundOnly = No
..IsParticleUpTowardsEmitter = No
End

(Die Punkte vor den Anweisungen sollen Leerzeichen sein)
Das ist nur ein kleiner Auszug davon, aber sollte verdeutlichen, worum es geht.

Nun meine brennensten Fragen (in der Hoffnung, dass jemand eine Antwort hat):

  1. Wie erstelle ich einen Anzeigebildschirm?
  2. Wie ist es möglich, dass der Effekt in Echtzeit im Anzeigebildschirm angezeigt wird?
  3. Wie erstelle ich das Raster, das ich ein-/ausblenden kann?
  4. Wie erkennt das Programm, welche Texturdateien verwendet werden sollen?
  5. Wie implementiere ich einen Zähler, der die Anzahl der Partikel anzeigt, wenn man den Effekt abspielt? (evtl. mit Höchstzahl der Partikel während des ganzen Effekts)
  6. Wie erkennt das Programm, dass die eingegebenen Werte den Effekt im Anzeigebildschirm beeinflussen sollen? (zb. wenn ich die Größe eines Partikels ändere, muss es dann auch im Anzeigebildschirm größer werden)
  7. folgt sicher auch noch...

Danke für alle Antworten :)

MfG Dibelius
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Sa 27.05.06 09:16 
Zitat:

[*]Wie erstelle ich einen Anzeigebildschirm?

Bevor wir uns missverstehen? Die Ausgabe im Spiel klappt bereits? Dann solltest Du doch mit der dortigen API ohne Probleme auch eine zweite Anwendung (Editor) erzeugen können und die Inhalte dort darstellen? Alles was Du brauchst ist ja schließlich eine Leinwand zum zeichnen. Für die meisten Grafik-APIs eigenet sich alles, was ein Handle hat. So kannst Du statt eines kompletten Fenster z.B. bei OpenGL auch nur ein Panel verwenden um darinne zu zeichnen.

Zitat:

[*]Wie ist es möglich, dass der Effekt in Echtzeit im Anzeigebildschirm angezeigt wird?

Wie auch im Spiel. Du mußt ständig die Render-Loop durchlaufen und damit eine Wiedergabe durchführen. Vor jedem Bild beginnst Du nun (wie im Spiel auch) die neuen Positionen zu berechnen. Beim Editor wird es wohl wünschenswert sein, wenn die Partikel immer wieder neu initalisiert werden und nicht plötzlich nur noch eine schwarze Fläche da ist.

Zitat:

[*]Wie erstelle ich das Raster, das ich ein-/ausblenden kann?

Abhängig von der Grafik-API. Generell: Linien ziehen mit zwei For-Schleifen - klappt in 2D und 3D ;)

Zitat:

[*]Wie erkennt das Programm, welche Texturdateien verwendet werden sollen?

Verstehe ich nicht. Programme tun nie automatisch etwas, Du mußt es definitieren, was es tun soll. Daher ist die Frage: Welche Textur soll er den verwenden? Du meinst Texturen für unterschiedliche Partikel-Typen? Ich denke, da wäre ein Fall für deine Ini-Dateien.

Zitat:

[*]Wie implementiere ich einen Zähler, der die Anzahl der Partikel anzeigt, wenn man den Effekt abspielt? (evtl. mit Höchstzahl der Partikel während des ganzen Effekts)

Für gewöhnlich haben Partikel eine Lifetime.... deine scheinbar auch. Ist dies 0 so wird das Partikel in der Regel nicht mehr angezeigt und ist tot. Du brauchst also nur die Anzahl der Partikel zählen, die > 0 sind um zu wissen, wieviele Partikel insgesamt angezeigt werden. Ist eine Lifetime <= 0, so kannst Du das Partikel wieder neu initalisieren um es wieder z.b. aus einer Quelle zu respawnen. Die Summe der initalisierten Partikel ist die Anzahl der Partikel, die insgesamt abgespielt wurden.

Zitat:

[*]Wie erkennt das Programm, dass die eingegebenen Werte den Effekt im Anzeigebildschirm beeinflussen sollen? (zb. wenn ich die Größe eines Partikels ändere, muss es dann auch im Anzeigebildschirm größer werden)

Du merkst, ich habe Probleme deinen Fragen zu folgen, weil es sich für mich anhört als würde bisher nur die Ini-Datei existieren und kein Partikelsystem. All deine Partikel sind normalerweise in einem Array mit Ihren Informationen. Zwei sinnvolle Ansätze gebe es um auf Veränderungen zu reagieren. 1. Du hast ein sehr schnell lebiges Partikelsysteme bei dem sehr oft neue Partikel initalisiert werden. Es würde sich anbieten, dass Du Änderungen (z.B. Größe) erst bei reinitalisieren setzt und der Effekt mit einer kleinen Verzögerung stattfindet. Dies Verfahren ist insbesondere dann wohl sinnvoll, wenn die Partikel allesamt sehr individuell sind und Du nicht für jedes eine konstante Größe hast, sondern nur einen Richtwert, der dann mit einem Zufallszahl ein wenig größer oder kleiner dargestellt wird. Sollten alle Partikel bei Dir identisch sein... so würde ich dieses Feld aus den Partikelinformationen nehmen und lieber nur eine Variable für das gesamte Partikelsystem setzen, dass die Größe speichert. Paßt Du dieses im Editor an, brauchst Du bei der Wiedergabe die Szene nur mit den neuen Werten darstellen.

So far... ich hoffe, ich habe Dich nicht ganz mißverstanden. Generell eine bitte: Gebt immer an, welche API Ihr verwendet oder verwenden wollt. Dies erlaubt einem wesentlich konkreter zu antworten.

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."