Dungeon-CampusMinden / Dungeon

The "Dungeon" is a tool to gamify classroom content and integrate it into a 2D Rogue-Like role-playing game.
MIT License
16 stars 36 forks source link

[GAME] Assets innerhalb der Jar einladen #932

Closed AMatutat closed 1 year ago

AMatutat commented 1 year ago

Mir ist aufgefallen, dass unser Jar nicht lauffähig ist, da unsere Assets nicht gelesen werden können.

image

Meine Erfahrungen mit so etwas sind relativ gering, daher korrigiert mich, wenn ich falsch liege:

Im DrawComponent machen wir

ClassLoader classLoader = getClass().getClassLoader();
File directory = new File(classLoader.getResource(path).getFile());
animationMap =
        Arrays.stream(directory.listFiles())
                .filter(File::isDirectory)
                .collect(Collectors.toMap(File::getName, Animation::of));

Wir laden das Verzeichnis für den Pfad ein und rufen dann Animation#of für jedes Unterverzeichnis auf. Animation#of sieht so aus:

public static Animation of(File subDir, int frameTime, boolean loop) {
    List<String> fileNames =
            Arrays.stream(Objects.requireNonNull(subDir.listFiles()))
                    .filter(File::isFile)
                    .map(File::getPath)
                    .collect(Collectors.toList());

    // Sort the files in lexicographic order (like the most OS)
    // Animations will be played in order
    Collections.sort(fileNames);
    return new Animation(fileNames, frameTime, loop);
}

Dort ziehen wir aus dem Unterverzeichnis alle Dateien und legen die Pfade als Strings in eine Liste. Diese Liste wird dann vom Painter genutzt, um die Texturen zu erstellen (new Texture(path)). Texture ist libGDX.

Ich bin mittlerweile soweit, dass File in Jars nicht verwendet werden kann und stoße immer wieder auf so etwas:

try (InputStream in = classLoader.getResourceAsStream(path);
    BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
    // Use resource
}

@fwatermann, so hast du das auch in deinem Crafting-Szenario gelöst (+ du hast irgendwie wild die Pfade korrigiert).

Ich würde unsere API nur ungerne ändern. Am liebsten würde ich mir aus dem InputStream einfach ein File parsen, aber das scheint nicht zu gehen. Die Beispiele, die ich finde, beziehen sich auch immer auf Text, wir arbeiten hier aber mit Bildern und Verzeichnissen.

Ich weiß auch nicht, wie sich die Pfade in Texture#ctor von LibGDX verhalten.

In meinem Kopf stelle ich mir eine Klasse ResourceLoader vor, mit der wir von nun an alle unsere Ressourcen laden. Die Klasse würde dann erst prüfen, ob wir in einer .jar-Datei sind oder nicht (so wie @fwatermann das bereits in Crafting gemacht hat) und dann die Ressourcen als InputStream einlesen und (irgendwie auf magische Weise) zu Files oder ähnlichem parsen. Ich habe nur keine Ahnung, wie das geht....

@AHeinisch @Lena241 @fwatermann @JudiTeller, ich bräuchte mal eure Hilfe.

fwatermann commented 1 year ago

Ich versuche heute das Inventar GUI Gedöns fertig zu bekommen und kann mir das dann mal anschauen.

AMatutat commented 1 year ago

Das geht vermutlich Hand in Hand mit #818