< Tutorials
Version vom 16. Februar 2015, 18:37 Uhr von Fuchsf (Diskussion | Beiträge) (Das .eaa - Format)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)


Ziel des Tutorials

Nach diesem Tutorial kannst du:

  • String- und int-Arrays in Dateien speichern.
  • String- und int-Arrays aus Dateien wieder einlesen.
  • Dateien in beliebigen (und beliebig tiefen) Ordnern deines Projekts ansteuern.
  • Dein Spiel-Projekt so exportieren, dass alle Verzeichnisanfragen in deiner ausführbaren .jar - Datei noch funktionieren.

Das .eaa - Format

Die meisten Informationen werden nach dem Beenden eines Spiels nicht mehr benötigt. Bei einem einfachen Spiel ist dies vor allem der ganze Spielaufbau. Dieser wird bei jedem Start von neuem erledigt und wird deshalb nicht extra gespeichert.

Ausnahmen sind zum Beispiel Spielstände, Highscores oder Verlaufslisten. Das sind Informationen, die beim nächsten Spielstart nicht unbedingt wieder genau so sein sollen wie beim letzten Spiel. Deshalb werden diese Informationen in der Regel für den nächsten Spielstart gespeichert. Es wäre z. B. schade, wenn der Highscore mit Schließen des Spiels verloren ginge.

Daher kann man mit der Engine Alpha Dateien speichern und laden. Derzeit ist der direkte Support der Engine beschränkt auf Arrays der folgenden Datentypen:

  • int-Arrays
  • String-Arrays

Diese Daten werden in einem eigenen Dateiformat der Engine Alpha gespeichert, nämlich dem .eaa-Format.

Erfahrungsgemäß reichen diese Datentypen für die meisten Anwendungen. Falls du für dein Projekt mit der Beschränkung dieses Formats an die Grenzen des möglichen stößt, gib uns gerne entsprechendes Feedback.

Die Klasse DateiManager

Alle Operationen, die das direkte Ein- und Auslesen von Dateien realisieren, sind über eine Klasse erreichbar. Das ist die Klasse DateiManager. Die Klasse DateiManager besitzt für alle nötigen Operationen statische Methoden. Das heißt diese Methoden führt man nicht über ein Objekt der Klasse DateiManager aus, sondern über die Klasse selbst.

Du kennst vielleicht schon die statische Methode:

System.out.println("Hi, das schicke ich direkt an die Konsole!");

Genau so funktionieren die Methodenaufrufe bei der Klasse DateiManager. Aber auch hierzu wird es viele Beispielcodes geben.


Dateien schreiben

Für das Schreiben eines int-Arrays (anders gesagt: eines int[]-Objektes) gibt es die Methode:

public static void integerArraySchreiben(int[] array, String dateiname)

Der Dateityp ist immer .eaa! Das ist ein spezielles Dateiformat für Arrays. Also endet der dateiname stets mit ".eaa".

Hierfür ein kleines Beispiel:

/**
 * Diese Methode schreibt ein Integer-Array und fuellt es mit den
 * Quadratzahlen.
 * Anschließend wird das Array als Datei gespeichert.
 */
public void quadratzahlenSchreiben() {
    int[] quadr = new int[10];
    for(int i = 0; i < quadr.length; i++) {
        quadr[i] = i*i;
    }
    //Durch den Aufruf dieser Methode wird das Array als Datei gespeichert
    DateiManager.integerArraySchreiben(quadr, "Quadratzahlendatei.eaa");
}


Dateien wieder einlesen

Anschließend lässt sich die Datei natürlich auch wieder einlesen, und zwar folgendermaßen:

public static int[] integerArrayEinlesen(String dateiname)


Somit lassen sich die Quadratzahlen folgendermaßen einlesen:

/**
 * Diese Methode ließt die geschriebene Datei wieder ein.
 * Anschließend wird sie die einzelnen Zahlen an der Konsole ausgeben.
 */
public void quadratzahlenEinlesen() {
    //Die folgende Methode liesst das Array wieder ein und gibt es zurueck
    int[] quadr = DateiManager.integerArrayEinlesen("Quadratzahlendatei.eaa");
    for(int i = 0; i < quadr.length; i++) {
        System.out.println(quadr[i]);
    }
}


Mit String-Arrays funktioniert das Ein- und Auslesen genauso. Die entsprechenden Methoden hierfür lauten:

public static void stringArraySchreiben(String[] array, String dateiname)

public static String[] stringArrayEinlesen(String dateiname)


Arbeiten mit Verzeichnissen

Bei einem größerem Spiel, für das viele Dateien geladen werden müssen (zum Beispiel Tutorials/Figuren), ist es vielleicht sinnvoll, in mehreren Ordnern alle Dateien systematisch zu ordnen, um Übersicht zu schaffen.

Das ist mit der Engine (seit Version 3.0) problemlos möglich. Vom ursprünglichen Projektordner aus kann man einen beliebigen Ordnerpfad durch /-Trennzeichen im Verzeichnis-String beschreiben, zum Beispiel:

String verzeichnis = "dieser/Pfad/funktioniert/auf/jedem/Betriebssystem.eaa";


Laden und Speichern bei einem exportierten Projekt (.jar-Datei)

Ist das Spiel fertig und wird als .jar-Datei exportiert, muss folgendes beachtet werden:

Alle zu ladenden Dateien müssen im selben Ordner, wie die ausführbare .jar-Datei abgelegt werden, damit sie standardmäßig geladen werden können. Während des Exportes sollten die Dateien dann nicht im Porjektordner enthalten sein. Das spart Speicherplatz.

Das hieße für das obige Beispiel, dass der Ordner "dieser" im selben Verzeichnis liegenmüsste, in dem die ausführbare .jar-Datei liegt.

Details zum Export deines Projektes findest du im Tutorial Projektexport.


Probleme?

Du kannst ein einfaches Beispielprojekt, das ein Array erstellen und speichern bzw. einlesen kann, herunterladen, testen und einsehen.