libGDX; Multiplattform-Game-Engine für Java

Für ein kleineres Projekt war ich auf der Suche nach einer Game-Engine für Java. Empfohlen wurde mir schlussendlich libGDX. Dabei handelt es sich um eine Game-Engine welche ursprünglich für Android entwickelt wurde. Mario Zechner, der ursprüngliche Entwickler der Engine, baute allerdings nach relativ kurzer Zeit eine Unterstützung für Desktopsysteme ein. Mittlerweile werden als Zielsysteme Linux, macOS, Windows, Android, iOS und der Webbrowser unterstützt.

Ein kleines Projekt in libGDX, nach ein paar Stunden Entwicklungszeit

libGDX eignet sich für 2D- als auch 3D-Spiele und ist relativ einfach strukturiert, so dass man in wenigen Stunden von einer Idee zu einem Ergebnis kommen kann. Die seit mittlerweile 2009 in der Entwicklung befindliche Engine wurde 2010 erstmalig veröffentlicht und hat sich seitdem stetig weiterentwickelt. Technisch basiert die Engine neben Java auf OpenGL, welches zum Rendering der Spieleszenen genutzt wird.

Die Liste der implementierten Features von libGDX ist lang. So wird Audio ebenso unterstützt wie die abstrakte Behandlung von Eingabegeräten, so das ein Spiel auf Touchscreen ebenso läuft wie auf gewöhnlichen Rechnern. Im Bereich der Grafik werden Partikelsyssteme, die Nutzung von Tile-Maps (mit einer nativen Unterstützung des TMX-Dateiformates) und vieles mehr unterstützt. Der Entwickler nutzt dazu die entsprechenden High-Level-APIs und muss sich nicht mit der konkreten Implementierung herumschlagen. Daneben existieren entsprechende Hilfs- bzw. Datenklassen, welche die verwendete Mathematik wie Matrizen, Vektoren und ähnliches abdeckt.

Aktivieren Sie JavaScript um das Video zu sehen.
Video-Link: https://www.youtube.com/watch?v=hA2e3xIuNlk

Neben den im Kern vorhandenen Features, existiert ebenfalls eine Unterstützung für zusätzliche Module, so können unter anderem Box2D und das Entity-System Ashley als zusätzliche Module eingebunden werden.

Die offizielle Seite des Projektes ist unter libgdx.badlogicgames.com zu finden. Neben der spartanischen Dokumentation auf der offiziellen Webseite, ist die Wiki des GitHub-Projektes ein guter Einstiegspunkt für den Start mit libGDX. Der Quelltext der Engine ist ebenfalls auf GitHub zu finden. Die Engine ist unter der Apache License in Version 2 lizenziert und somit freie Software.

Header in Postman von Tab zu Tab übernehmen

Mit der App Postman ist es möglich REST-API Aufrufe gegen beliebige Endpunkte durchzuführen. Wenn man nun bei einem Reponse auf einen Link klickt, so öffnet sich innerhalb von Postman ein neuer Tab mit dem Link als URL. Leider werden die Header des aktuellen Tabs dabei nicht übernommen. Wenn man sich innerhalb einer API bewegt, kann dieses Verhalten von Postman ziemlich anstrengend sein, da die Header dann immer wieder von Tab zu Tab kopiert werden müssen.

Die Einstellungen von Postman

Abhilfe schaffen hier die Einstellungen von Postman. In diesen befindet sich im Tab General der Punkt Retain headers when clicking on links. Sobald diese Einstellung aktiviert ist, werden bei einem neuen Tab, welcher durch einen Klick auf einen Link entsteht, automatisch die Header vom alten Tab in den neuen Tab übertragen.

Karten im RPG Maker MV verknüpfen

Im RPG Maker MV sind Karten die Essenz des Editor. Aus vielen unterschiedlichen Karten wird am Ende ein fertiges Spiel. Damit dies der Fall ist müssen die unterschiedlichen Karten im RPG Maker MV miteinander verknüpft werden. Dies geschieht über entsprechende Ereignisse.

Eine Weltkarte im RPG Maker MV

Um mehrere Karten miteinander zu verknüpfen, benötigt man im ersten Schritt mindestens zwei Karten. Anschließend wählt man im RPG Maker MV den Ereigniseditor aus und erstellt mit einem Doppelklick auf dem gewünschten Feld ein neues Ereignis. Unter Inhalte wird nun ein neuer Ereignisbefehl erstellt und dort der Befehl Spieler übertragen… ausgewählt. Zu finden ist dieser Befehl auf der zweiten Seite des sich öffnenden Fensters. Anschließend kann man eine Karte und Position auswählen zu welcher der erstellte Warp führen soll. Als Auslöser für das Event sollte in den meisten Fällen Spielerberührung ausgewählt werden.

Im Ereigniseditor wird der Warp angelegt

Damit ist ein einfacher Übergang von einer Karte zur nächsten Karte geschaffen worden. Für den Rückweg sollte ebenfalls ein entsprechendes Event erstellt werden. Daneben können Warps ebenfalls über die schnelle Ereigniserstellung im Kontextmenü des Ereigniseditors erstellt werden. Neben einfachen Übergängen von einer Karte zur nächsten, lassen sich auch kompliziertere Verknüpfungen zwischen den Karten herstellen. Eine häufig genutzt Variante kommt hierbei bei dem Übergang von der Weltkarte zu einer regulären Karte vor. Eine Stadt kann z.B. von vier Seiten betreten werden. Wenn man die Stadt auf der Weltkarte von links betritt, sollte der Charakter ebenfalls auf der linken Seite der Stadt auftauchen.

Je nach Blickrichtung wird der Charakter an eine andere Stelle teleportiert

Um diesen Fall abzudecken, erzeugt man ein Ereignis mit einer bedingten Verzweigung, welche in der Kategorie Ablaufsteuerung der Ereignisbefehle zu finden ist. Als Bedingung für die Verzweigung kann die Blickrichtung des Charakters genutzt werden. Für jede gewünschte Blickrichtung muss eine bedingte Verzweigung mit dem entsprechenden Warp erstellt werden. So wird der Charakter je nach Blickrichtung an eine andere Position der verknüpften Karte übertragen.

Workaround für Episoden Seiten im Podlove Publisher

Im Podlove Publisher gibt es in den Experteneinstellungen die Möglichkeit Episoden Seiten zu aktivieren. Gemeint ist damit nicht anders als alle Podcastbeiträge auf einer zusätzlichen Seite anzeigen zu lassen. Seit der Version 2.7.0 des Podlove Publisher funktionierte dieses Feature bei mir nicht mehr.

Die Episoden Seite für alle veröffentlichenden Podcasts

Hintergrund war der Commit b4d9f14; hier gab es unter anderem eine Änderung in der Datei permalinks.php. Wenn nun die URL für die Episoden Seiten eingestellt wurde funktionierte diese nicht mehr. Stattdessen gab es nur die Meldung das die Seite nicht existiert. Als Workaround habe ich die permalinks.php-Datei wieder um folgenden Quellcode aus dem Commit erweitert:

// Add archive pages
if ( 'on' == \Podlove\get_setting( 'website', 'episode_archive' ) ) {
	$archive_slug = trim( \Podlove\get_setting( 'website', 'episode_archive_slug' ), '/' );

	$blog_prefix = \Podlove\get_blog_prefix();
	$blog_prefix = $blog_prefix ? trim( $blog_prefix, '/' ) . '/' : '';

	$wp_rewrite->add_rule( "{$blog_prefix}{$archive_slug}/?$", "index.php?post_type=podcast", 'top' );
	$wp_rewrite->add_rule( "{$blog_prefix}{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", 'index.php?post_type=podcast&paged=$matches[1]', 'top' );
}

Der Quellcode muss an das Ende der Funktion podlove_add_podcast_rewrite_rules angetragen werden. Damit funktioniert das Episoden Seiten-Feature bei mir wieder ohne Probleme. Natürlich muss dieses Prozess bei jedem Update des Podlove Publisher wiederholt werden.

Waipoua-Theme für den Podlove Publisher anpassen

Seit meinem letzten Wechsel des Designs auf seeseekey.net nutze ich eine stark modifizierte Version des Elmastudio-Themes Waipoua. Neben Anpassungen am Design wurden unter anderem die externen Einbindungen der Google Fonts deaktiviert. In den aktuellen Themes von Elmastudio werden diese leider immer noch extern eingebunden; was wohl auch auf absehbare Zeit so bleibt.

Leider hat das Waipoua-Theme einige Probleme mit dem Plugin Podlove Publisher. Der Podlove Publisher ist ein Plugin, welches einen Workflow für Podcasts, vom Anbieten bis zum Abonnieren bereitstellt.

Podlove Podcast Publisher
Preis: Kostenlos

Das erste Problem mit dem Podlove Publisher im Zusammenhang mit dem Waipoua-Theme ist die Anzeige der von Beiträgen mit dem Post Type podcast auf der Startseite. In den Experteneinstellungen des Podlove Publishers ist dies die Einstellung Blog und Podcast kombinieren. Damit dies mit dem Waipoua-Theme funktioniert muss die Datei index.php des Themes angepasst werden. Dort findet sich folgende Quelltextblock:

<?php /* Start the Loop */ ?>
<?php global $query_string;
query_posts( $query_string . '&ignore_sticky_posts=1' ); ?>

  <?php while ( have_posts() ) : the_post(); ?>

    <?php get_template_part( 'content', get_post_format() ); ?>

  <?php endwhile; // end of the loop. ?>

<?php wp_reset_query(); // reset the query ?>

An dieser Stelle werden sämtliche Manipulationen der Abfrage entfernt. Anschließend sollte der Code so aussehen:

<?php /* Start the Loop */ ?>

  <?php while ( have_posts() ) : the_post(); ?>

    <?php get_template_part( 'content', get_post_format() ); ?>

  <?php endwhile; // end of the loop. ?>

Nach dieser Modifikation tauchen die Beiträge mit dem Post Type podcast in der Beitragsliste im Startmenü auf. Das nächste Problem betrifft die Darstellung der Beiträge mit dem Post Type podcast, sobald diese einzeln angezeigt werden. Hierbei wird das Design zerschossen, da der Beitrag in voller Breite angezeigt wird. Eine Sidebar würde in diesem Szenario nach unten rutschen.

Nach dem Fix funktionieren die Einzelseiten mit dem Post Type podcast

Um dies zu verhindern muss die Datei header.php angepasst werden. Dort findet sich nach dem schließenden head-Tag die Zeile:

<body <?php body_class(); ?>>

Diese Zeile wird entfernt und stattdessen durch folgenden Quellcode ersetzt:

// Fix problem with single posts (post type: podcast)
$body_class = get_body_class();

// single-podcast exists in body class, replace
if (in_array("single-podcast", $body_class)) {

  echo "<body class=\"";

  foreach($body_class as $body_class_value) {
    if ($body_class_value == "single-podcast") {
      $body_class_value = "single-post";
    }

    echo $body_class_value . " ";
  }
  
  echo "\" >";
}
else {
?>
  <body <?php body_class(); ?>>
<?php
}
?>

Der Quellcode sorgt dafür das die Klasse single-podcast in single-post umbenannt wird. Damit greift das CSS für gewöhnliche Beiträge und die Darstellung der Podcast-Seiten funktioniert ohne Probleme. Als letzten Schritt habe ich die archive.php angepasst. In der Datei wurde der komplette header-Block entfernt. Diese Anpassung ist im Gegensatz zu den anderen Anpassungen Geschmackssache. Sie sorgt dafür das keinerlei Archivtexte mehr auftauchen.