22.Mai | Chronos: Ressourcen-Management

icon-chronos-alpha

Im vorherigen Artikel habe ich das neue Entitäten-System von Chronos thematisiert. Heute möchte ich Euch das neue Ressourcen-System vorstellen. Ich habe es grundlegend überarbeitet, um es benutzerfreundlicher und mehr erweiterbar zu machen. Das alte System unterstützte lediglich nur XML und war nicht erweiterbar. Das ändert sich nun ab der neuen Version. Standardmäßig wird JSON und XML unterstützt – es können aber neue Formate wie MySQL oder YAML erstellt werden.

Ressource anlegen

Als erstes benötigen wir eine Ressource. Dies kann eigentlich alles sein: Ein Bild, eine Zeichenkette oder eine Musikdatei. wir entscheiden uns für ein beliebiges Bild, taufen es test.png und speichern es in dem Ordner res/images/. Wir entscheiden uns in diesem Beispiel, die Ressource in einer XML-Datei zu handhaben, die wir my-resources.xml nennen. Eine einfachste Form sähe wie folgt aus:

Diese Datei definiert jetzt, welche Ressourcen es überhaupt gibt und von welchem Typ diese ist. Chronos unterstützt bisher aber nur zwei Typen: string, welcher eine Zeichenkette repräsentiert und vector, welcher einen Vektor in einem Raum definiert. Würden wir diese obige Datei von Chronos einlesen wollen, würde uns Chronos mitteilen, dass der Typ image nicht aufgelöst werden kann. Um das Problem zu lösen, müssen wir uns einen sogannten RessourceLoader schreiben.

Im folgenden Beispiel entscheide ich mich für einen Loader, der mir  Image-Objekte der Grafikbibliothek Slick2D serstellen kann:

In Zeile 1 registrieren wir den Loader mithilfe einer Annotation. Fehlt diese, ist Chronos nicht im Stande, diesen zu finden. Es gibt aber auch die Möglichkeit, in der chronos.xml Datei Loader zu registrieren, was aber ein anderes Thema ist. Der Name in der Annotation entspricht dem Namen, der auch als Typ in der XML-Datei verwendet wird. Dieser kann komplett variieren.

In Zeile 6 ”holen” wir uns den Inhalt der Ressourcen-Definition (in unserem Falle wird es res/images/test.png sein). Anschließend versuchen wir, ein neues Bild zu erstellen. Schlägt dies fehl (siehe Zeile 12), sollten wir eine Exception werfen. Diese sollte immer dann geworfen werden, wenn etwas mit der Definition nicht in Ordnung ist oder eine Ressource nicht gefunden werden kann.

Ressource verwenden

Nun schreiben wir uns ein kleines Programm, um unsere Ressource zu laden und verwenden zu können:

That’s it! Wir laden zuerst unsere Ressource in den Manager (Zeile 4) und können diese anschließend in Zeile 10 mithilfe der ID (in unserem Falle “test”) abgreifen.

Fazit

Wir haben gesehen, dass wir im obigen Beispiel die Klasse XMLSource  verwendet haben. Betrachtet man die load-Methode des Managers genauer, erwartet er eine Implementierung des Interfaces DataSource . Chronos bietet ebenfalls noch die Klasse JSONSource  an, mit deren Hilfe wir unsere Ressource auch in einer .json-Datei definieren können.

Ressourcen-Management in Chronos kann noch weit komplexer sein. Man kann seine Ressourcen gruppieren und beispielsweise das Attribut deferred="true"  setzen, um Ressourcen nachträglich laden zu können, sobald diese gebraucht werden. Das vorgestellte System ist Teil der neuen Version 0.8, welche noch nicht fertig ist. Wer den Fortschritt von Chronos beobachten möchte, kann dies getrost auf der offiziellen Webseite nachschauen.

19.Mai | Chronos: Entitäten und Positionierung

icon-chronos-alpha

Vor wenigen Minuten habe ich eine neue Komponente von Chronos fertiggestellt: Das neue Entity-System. Da das alte extrem undynamisch war und sehr schlecht zu handhaben war, habe ich mich dazu entschieden, es komplett neu zu entwerfen und zu schreiben. In diesem Artikel möchte ich Euch zeigen, wie einfach es mit Chronos ist, Entitäten für das eigene Spiel zu verwenden. Weiterhin zeige ich Euch die verschiedenen Möglichkeiten, wie Entitäten zusammenhängen können und wie man selber Beziehungen definieren kann.

Die folgenden vorgestellten Features sind Teil der Version 0.8alpha, welche noch nicht veröffentlicht wurde. Diese Features sind nicht in der aktuellen Version 0.7.3alpha enthalten. In den kommenden Wochen werde ich diese aber via Google Code veröffentlichen!

Ein Beispiel

Stellen wir uns vor, wir möchten ein eigenes Raumschiff-Spiel schreiben. Wir möchten, dass ein Raumschiff Waffen besitzen kann. Eine erste Struktur mit Chronos kann so aussehen:

Spaceship.java

 Weapon.java

Besonders interessant ist Zeile 13 der Klasse Spaceship.java. Dort heften wir die Waffe “an” das Raumschiff. Sollte sich das Raumschiff bewegen, wird sich die Waffe ebenfalls bewegen, ohne dass der Programmierer wissen muss, wo das Raumschiff grade ist. Dies ist eine Besonderheit von Chronos - das Toolkit nimmt dem Programmierer extrem viel Arbeit ab.

Ein kleines Programm

Nun wollen wir unser erstes Programm schreiben. Es wird keinerlei Grafik enthalten – wir verwenden für unser Beispiel lediglich die Konsole. Als erstes legen wir uns ein neues Raumschiff an.

Danach “rüsten” wir es mit einer Waffe aus und schießen einmal munter los:

Wir erhalten so folgende Ausgabe:

Das hat schonmal geklappt. Doof ist nur, dass die Waffe jetzt ziemlich weit vom Raumschiff entfernt ist. Chronos arbeitet nämlich mit bei der Positionierung mit zwei Systemen: einem globalen und einem lokalen Koordinatensystem. Standardmäßig werden alle Koordinatenänderungen global vorgenommen. Anders gesagt: Globale Koordinaten sind absolut, während lokale Koordinaten relativ zum Elternobjekt sind (ähnlich wie in CSS  bei DOM-Elementen). Demzufolge sollten wir nun unsere Waffe lokal ausrichten. Danach bewegen wir das Raumschiff und schießen erneut:

Wir erhalten folgende Ausgabe in der Konsole:

Dabei handelt es sich um die absolute Position der Waffe – da sich das Elternobjekt (das Raumschiff) an Position 500.0|500.0 befindet, wird die lokale Position der Waffe hinzugerechnet.

Fazit

Mithilfe des neuen Entity-Systems ist es möglich, schnell und unkompliziert Positionslogik zu gewährleisten. Wir wollen beispielsweise, dass ein Charakter eine Fackel hält, die alles um ihn herum beleuchtet. Wir brauchen einfach nur die Fackel an den Charakter anheften und sobald dieser sich bewegt, wird sich die Fackel automatisch mitbewegen. Im obigen Beispiel habe ich nur zwei Koordinaten verwendet. Chronos ist dahingehend unabhängig und kann ebenfalls für 3D-Spiele verwendet werden.

13.Mai | Neue Version von Chronos in Entwicklung

chronos-icon

Seit ungefähr einer Woche arbeite ich an einer neuen Version (v. 0.8alpha) von Chronos. Da ich in meinem Spiel Galacticum Features benötige, die leider in der alten Version 0.7.3alpha nicht richtig umgesetzt wurden. Ich habe deshalb das komplette Repository aufgeräumt und schreibe die wichtigsten Kernkomponenten neu, um sie besser erweiterbar zu machen. Gleichzeitig versuche ich nun, mithilfe von Testdriven-Development Fehler von Anfang an auszumerzen. Folgende Features werden in Version 0.8alpha enthalten sein:

  • Verbessertes Model-System. Verwendung von Interfaces statt Klassen und verbesserte Koordinaten- und Rotationsberechnung
  • Verbessertes Ressourcen-System: Verwendung von Annotations und Unterstützung von mehreren Formaten wie XML und JSON
  • Neues Updating-System: Updaten von Spielen wird noch einfacher. Mit der neuen Updating-API ist es kinderleicht, das eigene Spiel zu updaten
  • Scripting wird weiter und besser integriert

Dies werden die Hauptmeilensteine dieses großen Updates. Bis zur Vollversion (1.0) sind noch folgende Features in Planung:

  • Language-Support mithilfe von Resource-Bundles und .properties-Dateien
  • Modding-System zum Ermöglichen von Game-Mods für das eigene Spiel
  • Command-System zum Definieren eigener Befehls-Strukturen

Bis zur Vollversion wird noch einige Zeit vergehen. Ich hoffe, dass ich es bis zum Ende diesen Jahres schaffe, da ich ab kommenden Jahr Chronos für mein Groß-Projekt “One Game A Month (1GAM)” benötige. Weitere Informationen werden natürlich folgen. Wer den aktuellen Entwicklungsstand von Chronos beobachten möchte, kann gerne die offizielle Google Code Seite besuchen.