parrotengine

Main Character für die "Parrot Quest"

Der Held (work in progress)Der Held (work in progress)Das Spiel das ich als Demo für die ParrotEngine gerade erstelle benötigt natürlich einen Hauptdarsteller und wie der Name der Engine unschwer verrät wird es ein Papagei werden. Rechts seht ihr den aktuellen Stand des 3D Models. Ich erstelle alle Modelle in Blender. Der Papagei ist aktuell bereits gerigged und animiert.
Damit es voran geht, werde ich als erstes dieses Model verwenden um ein spielbares Level zu implementieren. Die Feinarbeiten kommen irgendwann später. Falls dies hier ein 3D-Artist liest und dieser fit in Blender ist, nehme ich auch gerne Hilfe an!
Die erste TestmapDie erste TestmapDie erste Testmap wird sehr simpel gestrickt sein. Auf dem Screenshot links sieht man den Weg der zurückgelegt werden muss. Links unten ist der Startpunkt (Player Spawn Point) und rechts der Bereich bei dessen Erreichen die Map als erfolgreich erledigt erkannt wird. Der Spieler wird diesen Bereich nicht verlassen können - auf diese Weise kann man sich später im Spiel nicht um Gegner und Hindernisse "herummogeln". Geheimgänge, Abkürzungen und sonstige Geheimnisse müssen in einer Map gezielt eingebaut werden.

Um meine Engine nicht alleinig auf Jump'n Run Spiele auszurichten habe ich eine Zwischenschicht eingeführt: Das "JumpNRun Modul". Dieses enthält neben dem auf diese Art Spiele spezialisierten Map-Editor auch weitere dafür benötigte Hilfsklassen. So bleibt die Engine zwar weniger "mächtig", dafür aber allgemeingültig und kann später auch für eventuelle weitere Module verwendet werden. Ich denke da an soetwas wie ein "FirstPerson Modul" oder ein "Platform Modul"... doch eins nach dem anderen.

Resource Collection

Derzeit programmiere ich an einem Map-Editor. Dieser soll sowohl einfach zu bedienen, also auch vollständig bezüglich der Funktionalität sein. Dabei stellte sich mir das Problem wie ich sicherstellen kann, dass ein Spiel auf genau die gleichen Resourcen zugreifen kann wie der Editor: Schließlich werden die Elemente die im Editor in die Map platziert wurden auch vom Spiel benötigt wenn dieses die Map einladen und darstellen möchte.

Diagramm: ResourceCollectionSetDiagramm: ResourceCollectionSet

Als Lösung für dieses Problem habe ich die Resource-Collections ins Leben gerufen. Es handelt sich hier um eine Datei im XML Format die eine Liste aller Resourcen enthält die ausgehend vom Ort der resource-collection.xml Datei erreichbar sind. Da die Engine bisher für alle Zugriffe auf Resourcen InputStreamSource-Objekte verwendet, nutzt das Konzept für die Collections diese natürlich ebenfalls. Das bedeutet, dass ein Programm, welches über irgendein InputStreamSource-Objekt an eine resource-collection.xml Datei kam, über genau das gleiche Objekt alle in der XML erwähnten Resource Objekte laden kann!

Die Engine selbst besitzt standardmäßig eine eigene ResourceCollection. Diese enthält neben dem Engine-Logo auch die Standard-Fonts, default-Texturen und Standard-Skyboxen. Damit Programme die die Engine nutzen den Satz an verfügbaren Resourcen ergänzen können gibt es das ResourceCollectionSet. Dieses enthält eine Liste von Resource-Collections.

Das ResourceCollectionSet kann jederzeit um weitere Resource-Collections ergänzt werden. Wird vom Spiel aus eine Resource angefordert, so geschieht das über die ReaderFacade:

ReaderFacade facade = engine.getReaderFacade();
MeshPrototype m = facade.readMeshPrototype("meshes/mesh1.xml");

Die Methode facade.readMeshPrototype(...) ruft hier das ResourceCollectionSet auf und dieses sucht dann der Reihe nach in allen registrierten ResourceCollections nach "meshes/mesh1.xml". Der erste Fundort wird dann genutzt um das Objekt zu laden.

Jede ResourceCollections kann dabei eine andere InputStreamSource besitzen: Netzwerk, ZIP-Archiv, lokales Fileystem, Klassenpfad,... alles ist hier erlaubt.

Um nun auf den eigentlichen Grund dafür zurückzukommen: Es genügt nun die Übergabe eines InputStreamSource Objekts sowie eine dafür gültige Pfadangabe zu einer resource-collection.xml um sicherzustellen, dass eine Menge von Resourcen genau definiert ist. Für die meisten Anwendungsfälle wird es wohl so sein, dass während der Entwicklungszeit das InputStreamSource Objekt eine Instanz von DirectoryInputStreamSource sein, welches einfach auf ein Filesystem-Verzeichnis verweist. Später, in einem Release wird dies wohl eher ein Verweis auf ein ZIP oder JAR-Archiv sein.

Das ResourceCollectionSet-System ist derzeit nur im Subversion-Repository vorhanden. Es wird aber im nächsten Release der Engine enthalten sein zusammen mit Beispielprogrammen.

ParrotEngine 0.2 released!

Ab sofort ist die Version 0.2 der 3D Parrot Engine verfügbar! Gegenüber der Vorversion wurde die grundlegende Struktur der Engine überarbeitet, das Renderverfahren flexibler gestaltet und eine Menge Performanceoptimierungen sowie Verbesserungen an der Klassenstruktur vorgenommen.

Dieses Release hat als Hauptaufgabe die Basisinfrastruktur der Engine so zu stabilisieren, dass eine feste Grundlage entsteht auf der alle weiteren Erweiterungen implementiert werden können ohne eine erneute Anpassung der Grundstruktur zu erfordern.

Mit dieser Version kommen nun auch einige Beispielprogramme um den Einstieg in die Programmierung mit der Engine zu erleichtern und auch um die Features zu demonstrieren. Das Build-System wurde komplett überarbeitet so dass nun ein einzelnes build.xml alle Aufgaben erledigen kann: Auch das Starten der Beispielprogramme.

Ein Getting-Started Tutorial zeigt, wie einfach mit der Entwicklung mit der Engine begonnen werden kann. Angefangen von der Einrichtung der Entwicklungsumgebung bis hin zum ersten lauffähigen Programm. Die Downloads und weiteren Links befinden sich wie gehabt auf der Hauptseite der Engine.

ParrotEngine - Getting Started

Einrichten der Entwicklungsumgebung

Zuerst Eclipse downloaden von www.eclipse.org/downloads. Am einfachsten ist es, hier die "Eclipse IDE for Java Developer" zu nehmen. Die Parrot Engine stellt keine besonderen Anforderungen an die Eclipse-Variante, hauptsache die JDT (Java Development Tools) sind dabei. Das heruntergeladene Eclipse kann dann in einen beliebigen Ordner entpackt werden. Danach empfiehlt es sich auch das JDK6 von java.sun.com herunterzuladen und zu installieren - dadurch wird es möglich auch in Eclipse Ant-Skripte laufen zu lassen und Programme zu debuggen. Außerdem enthält das JDK eine Menge andere nützliche Tools für Entwickler.

Nach dem Start von Eclipse erscheint zunächst die Frage nach einem Workspace - hier kann ein beliebiger Ordner gewählt werden.

Ist Eclipse schließlich gestartet, sollte im Dialog unter "Windows / Preferences" auf der Seite "Java / Installed JREs" noch das soeben installierte JDK hinzugefügt und als Default ausgewählt werden indem der Haken vor dem JDK gesetzt wird.

Das Complete-Package der Parrot-Engine downloaden und an einem beliebigen Ort speichern.

Unter Eclipse im "Package Explorer" Fenster mit der rechten Maustaste "Import" und in dem sich öffnenden Dialog dann "General / Existing Projects from Workspace" auswählen. Dort dann das heruntergeladene Parrot-Engine Archiv angeben unter "select archive file". In der Liste der gefundenen Projekte dann die Parrot Engine auswählen und "Finish" klicken.

Die Engine ist nun als Projekt in Eclipse eingerichtet und kann gebaut werden:

Blendet mit "Window / Show View / Ant" die Ant-View ein und fügt dann in der neu erschienenen View mit dem Titel "Ant" mit dem Kontextmenü "Add Buildfiles" das build.xml aus dem ParrotEngine Projekt hinzu.

Klappt den Eintrag "TheParrotEngine" auf und doppelklickt dann auf "all". Der Build-Prozess startet nun und sollte ohne Fehler beenden.

Nun könnt ihr bereits die Beispiele starten indem ihr das Ziel "run-samples-browser" doppelt anklickt! Das Programm zum Aufrufen der Samples wird dann gestartet.

Eigene Programme mit der Engine schreiben

Erstellt ein neues Java-Projekt und ruft anschließend die Properties des Projekts auf und wechselt dort in das Pane "Java Build Path". Dort muss das ParrotEngine-Projekt hinzugefügt werden. Dies geschieht in dem Tab "Projects" mit dem Button "Add Jars". Wählt dann das "TheParrotEngine" Projekt aus. Durch diesen Eintrag bekommt das neue Projekt Zugriff auf die Klassen und Daten der Engine.

Erstellt nun eine neue Klasse "Test" die folgenden Code beinhaltet:

import de.gaffga.parrotengine.engine.Engine;
import de.gaffga.parrotengine.engine.EngineException;

public class Test {

    public static void main(String[] args) throws EngineException {
        Test test = new Test();
        test.start();
    }
   
    public void start() throws EngineException {
        Engine engine = new Engine();
       
        engine.start();
    }
}

Nun muss noch eine neue Run-Configuration für diese Klasse erstellt werden. Dies geht unter "Run / Run Configurations"; dort ist "Java Application" auszuwählen und dann mit dem Icon "New launch configuration" ein neuer Eintrag zu erstellen. ACHTUNG: Stellt unbedingt sicher, dass unter der Registerkarte "JRE" in der Run-Configuration das JDK 1.6 das ihr oben eingetragen habt eingestellt ist - sonst gibt es Probleme mit der Darstellung von Texturen.

Wenn ihr das Programm startet, erhaltet ihr kurz den Startbildschirm der Engine und anschließend einen schwarzen leeren Screen. Das Programm kann über das Schließen des Fensters oder über die Console mit "^" und anschließend "quit"+Enter beendet werden. Hier gibt es weitere Infos zu den Console-Kommandos.

Ihr habt nun das erste Programm mit der Engine erstellt. Jetzt können weitere Features integriert werden. Schaut euch dazu am besten mal die Beispiele an. Diese befinden sich unter dem Projekt "TheParrotEngine" im Ordner "src" im Paket "de.gaffga.parrotengine.samples".

Dokumentation der Console-Kommandos

Tastaturbelegung

Taste Funktion
^ Ein-/Ausblenden der Console.
Tab Ausführen der automatischen Vervollständigung. Falls der eingegebene Text eindeutig weiter ergänzt werden kann wird er das. Ist das nicht der Fall, werden alle bekannten Eingaben aufgelistet die mit der bereits getätigten Eingabe möglich sind. Das Drücken von Tab ohne etwas eingegenen zu haben listet somit alle vorhandenen Kommandos und Variablen auf.
Seite hoch / runter Anzeigen von älteren/neueren Ausgaben der Console. Mit diesen Tasten kann man sich Ausgaben die bereits oben über den Bildschirm hinausgelaufen sind wieder zurückholen.
Cursor hoch / runter Durchschalten durch die bereits eingegebenen Kommandozeilen. So kann man sich eine bereits eingegebene Zeile wiederholen und zum Beispiel dann einfach nur den mitgegebenen Parameter verändern und erneut ausführen lassen.
Cursor links / rechts / Pos1 / Ende / Entf / Backspace Dies ist die übliche Navigation und Bearbeitung einer Zeile mit dem Cursor.

Kommandos

quit

Beendet die Anwendung und die Engine sofort.

dump_timer

Gibt eine Liste aller registrierten Timer mit deren aktuellem Wert in ms aus.

d_add_graph "TIMER_NAME"

Fügt einen neuen Performance-Graphen hinzu der die Werte des angegebenen Timers anzeigt. Der Name ist aus der dump_timer Liste zu entnehmen und muss als String in Anführungszeichen angegeben werden.

d_remove_graph "TIMER_NAME"

Entfernt den angegebenen Timer aus dem Performance-Graphen wieder.

Variablen

d_draw_boundingspheres BOOL

Falls BOOL 1 ist, werden für alle Objekte die zugeordneten Bounding Spheres gezeichnet.

d_draw_names BOOL

FallsBOOL 1 ist, werden die Namen aller Objekte angezeigt.

d_draw_names_size BOOL

Stellt die Größe ein in der die Namen der Objekte gezeichnet werden.

d_draw_perf_infos BOOL

Falls BOOL 1 ist, werden die Performance Graphen angezeigt.

d_draw_statistics  BOOL

Falls BOOL 1 ist, wird ein Fenster mit wichtigen Kennzahlen eingeblendet.

d_skybox_visibleBOOL

Falls BOOL 0 ist, wird die Skybox abgeschaltet, 1 schaltet sie wieder ein.

d_draw_particle_systems BOOL

Falls BOOL 1 ist, werden Partikelsysteme gezeichnet, bei 0 nicht.

d_terrain_lod_factor FACTOR

FACTOR ist ein Wert der die Geschwindigkeit bestimmt wie schnell das Terrain vom feinsten LOD zum gröbsten LOD übergeht. Werte <1 können zu Darstellungsfehlern führen, Werte >1 führen zu sehr langsam abnehmenden LOD.

d_terrain_lod_near DISTANCE

Gibt an bei welcher Distanz gerade noch der feinste LOD verwendet werden soll. Terrainblöcke die weiter entfernt werden bekommen abnehmende LOD Levels zugeteilt.

d_terrain_frustum_culling BOOL

Falls BOOL 1 ist, wird für die TerrainBlöcke Frustum Culling durchgeführt, bei 0 nicht.

Feuer-Demo des Partikel-Systems

Ich habe eine Webstart-Demo online gestellt die den aktuellen Stand des Partikel-Systems in der Parrot Engine zeigt. Das Beispiel zeigt ein aus Partikeln bestehendes Feuer.

In der Engine gibt es bereits einen umfangreichen Partikel-Editor der das erstellte System per XML exportieren kann. Diese XML-Datei wird direkt von der Engine verarbeitet und das hierdurch definierte System kann anschließend direkt in den Szene-Graphen eingefügt werden. Das Zeichnen und simulieren des Systems steuert dann alles die Engine ganz automatisch.

Beim nächsten Release wird sowohl der Partikel-Editor schon mit dabei sein als auch diese Feuer-Demo und der Alienshooter. Ich hoffe auch, dass ich dazu kommen werde mit dem nächsten Release einiges an Dokumentation mitzuliefern: Eine Referenzdoku sowie ein "Getting-Started" sind wohl erstmal am dringensten.

Preview-Release des Alien-Shooters!

Das erste Preview-Release meines Alien-Shooters ist raus!

Ihr könnt den Alien Shooter über Java WebStart starten

Spielinhalt

Das Ziel des Spiels ist es so viele Punkte wie möglich durch das Abschiessen von Aliens zu sammeln. Die Aliens steigen hinter einer Bergkette auf und überqueren das Spielgebiet bevor sie wieder verschwinden. Der Spieler hat während dieser Passage die Möglichkeit die Ufos abzuschiessen.

Zum Schiessen hat der Spieler eine Kanone mit zwei Rohren die jeweils abwechselnd eine Rakete abfeuern können. Raketen fliegen nicht unendlich schnell, so dass man etwas vorhalten sollte um die Ufos auch zu treffen.

Es gibt Extrapunkte wenn mehr als 70% der Schüsse ihr Ziel erreicht haben und wenn alle Ufos eines Levels erledigt wurden.

Das Spiel endet, wenn in einem Level nicht mindestens die geforderte Abschussquote erreicht wurde.

In der aktuellen Preview-Version gibt es derzeit nur eine Sorte Ufos und 5 Level. Die später folgende, fertige Version wird viele verschiedene Feinde, deutlich mehr Level und ggfls. auch Powerups und Sondermissionen beinhalten.

Bedienung

Die zum Spielen notwendigen Tasten werden stets eingeblendet. Außerdem benötigt ihr die Maus um die Kanone zu steuern und zu schiessen.

Während des Spiels kann mit "ESC" pausiert werden.

Fehler gefunden?

Falls irgendetwas nicht funktionieren sollte, dann sendet mir bitte die Datei "alienshooter.log" aus eurem Homeverzeichnis mit einer Beschreibung was ihr gemacht habt, was nicht funktierte und wie sich das geäußert hat.

Die Log-Datei findet ihr unter einem deutschen Windows XP unter C:/Dokumente und Einstellungen/BENUTZERNAME. Unter Vista findet ihr den Ordner unter C:/Users/BENUTZERNAME. Bei Vista ist es egal ob ihr eine deutsche oder englische Version benutzt.

Ich freue mich natürlich auch über Anregungen, Anfragen, Kritik, Tipps und alles andere an Feedback!

Viele Grüße und viel Spaß - Stefan

Das Alien Shooter-Spiel nähert sich der Fertigstellung

Die letzten Tage waren vor allem mit der Arbeit an dem 3D-Font erfüllt. Hierzu habe ich die Convert-Funktion von Blender genutzt (Alt-C) um aus einem Font-Objekt ein Mesh zu erzeugen. Nachdem die Faceanzahl über den Decimate-Modifier verringert wurde und der Font per extrudieren in die Tiefe gezogen wurde, habe ich die Vorderseite manuell noch etwas interessanter gestaltet. Das manuelle Löschen der Vorderseite jedes Characters und durch eine manuell erzeugte, mit einer Kante versehenen auszutauschen war eine wahre Fleissarbeit...

Dieser Font kommt nun überall im Spiel zum Einsatz. Der neu erstellte Intro-Screen enthält diesen Font zweimal - jeweils mit einem anderen RenderState. Der Titel des Spiels ist mit einer Textur überzogen deren u/v Koordinaten über einen Fragment-Shader bewegt werden. Der Text unten "Press SPACE to start" entält lediglich einen sehr einfachen Lighting-Shader der einfache Beleuchtungseffekte erzeugt damit der Font räumlicher wirkt.

  • Die Raketen die der Spieler abfeuern kann haben nun, nach der Optimierung des Partikelsystems auch eine Rauchwolke die sie hinterlassen.
  • Titelmusik ist implementiert (von http://audio.ibeat.org/)
  • Die Ufos haben nun auch einen Explosions-Sound wenn sie getroffen werden
  • Es gibt einen Radar der anzeigt wo gerade Ufos sind - der Spieler muss dann nicht so viel suchen
  • Ein Level des Spiels besteht aus mehreren Angriffswellen - definiert über XML-Dateien. So können einfach neue Levels hinzugefügt werden.

Und es geht weiter....

Partikelsystem implementiert

Die erste Version meines Partikelsystems ist fertig:

Explodierendes Raumschiff mit Partikel-ExplosionExplodierendes Raumschiff mit Partikel-Explosion

Die Frameanzahl bricht durch die Explosion leider ziemlich stark ein: Von etwa 800 auf 200. Dieser Effekt kumuliert sich natürlich wenn mehrere Explosionen zeitgleich sichtbar sind. Das Partikelsystem muss jetzt erst mal grundoptimiert werden bevor es wirklich fertig ist:

  • Das Partikelsystem nur zeichnen wenn mindestens ein Partikel im Frustum sichtbar ist (während der Partikel-Updates die maximale quadratische Entfernung der Partikel vom Zentrum berechnen und daraus die BoundingSphere ermitteln)
  • Nach passenden OpenGL-Extensions suchen die es möglich machen die Partikel einfacher zu rendern - und nicht jedes einzelne als Quad... falls die Erweiterung existiert und sehr schnell ist, ist der Punkt 1 vermutlich nicht mehr nötig.
  • Die Filterung und die Leuchteffekte der Partikel über einen eigenen Shader realisieren und nicht über mehrere RenderStates zwischen denen gewechselt werden muss.

Damit die Explosion noch besser aussieht, brauche ich dringend interessantere Texturen für meine Partikel. Derzeit verwende ich einfache Punkte die nach außen einen weichen Verlauf zu vollständiger Transparenz haben. Ich werde mal sehen wie andere Formen sich als Explosions-Partikel machen.

Skinning Teil 1

Ein Beispiel-SkelettEin Beispiel-Skelett

Mittels Skinning ist es möglich 3D-Figuren zu animieren. Das Prinzip ist ähnlich wie in der Natur: Haut ("Skin") und Fleisch befinden sich auf einem Knochenskelett. Muskeln greifen an den Knochen an um mit ihnen die Haut zu bewegen. Sie bewegt sich mit, da sie fest mit dem Rest des Körpers verbunden ist. Das Skinning zur Animation von virtuellen Figuren funktioniert ähnlich: Indem Knochen direkt durch Transformationen bewegt werden. Das Mesh selbst stellt das Skin dar. Jedem Knochen ("Bone") des Skeletts werden nun Teile des Skins zugeordnet die sich mit der Bone bewegen sollen. Da es auch möglich ist, dass ein Bereich durch mehrere Bones beeinflusst wird, wird den Zuweisungen noch eine Gewichtung hinzugefügt - dadurch kann festgelegt werden wie stark eine Bone die Position eines Punkts ändert.

Syndicate content