Arraylist von allen bildern filtern und sortieren

AmsananKING

Mitglied
Hallo alle Zusammen,
Ich habe erst vor ein bis zwei Monaten angefangen zu Programmieren und möchte gerne ein Spiel programmieren hierzu habe ich Sprites erstellt und in einem Ordner gespeichert. Nun habe ich die Bilder aus dem Ordner in einer Liste gespeichert. Jetzt möchte ich Arrays jeweils nach den Strings dem Key entsprechend erzeugen. Diese Strings möchte ich mit den File paths aus der ersten Liste mit einander vergleichen, dann die Arrays dem key entsprechend befüllen. Am Ende möchte ich die File Arrays in einer File[] Arrayliste speichern. Kann mir jemand hierbei helfen.
Mit freundlichen Grüßen Amsi

[CODE lang="java" title="List.class" highlight="43-46,34"]package Bilder.Resizer.Lister;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;


public class List {

static ArrayList<File[]> list =new ArrayList<>();
static ArrayList<File> filing =new ArrayList<>();
static final File dir=new File("//src//Textures");
static final String[] EXTENSIONS = new String[]{
"gif", "png", "bmp"
};
static final String[] key={"IDLE","ATTACK","HURT","DIE","JUMP","WALK","RUN","background"};


static final FilenameFilter IMAGE_FILTER =new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
for (final String ext :EXTENSIONS){
if (name.endsWith("."+ext)){
return (true);
}
}
return false;
}
};
public static void Listing(){

//Dateien bzw Bilder werden in filing gespeichert
if (!dir.isDirectory()){System.out.println("Kein Ordner");}
else {
for (final File f:dir.listFiles(IMAGE_FILTER)){
try {
filing.add(f);
}catch (final Exception e){}
}
}
/*hier soll in einer For-Schleife(int i=0;i<filing.size;i++) in einem if alle File.path.contains key[0]

jeweils in new Array File vorerst gespeichert werden um dann durch list.add() das Array mit den Files welche alle den String "Idle" im Path beeinhaltet zu speichern
* */
}

}
[/CODE]
 
Zuletzt bearbeitet von einem Moderator:

mihe7

Top Contributor
Sprites sind Ressourcen und solche behandelt man nicht wie Dateien, sondern wie ... Ressourcen. Diese werden in Java-Packages abgelegt und somit über den Classpath geladen. Je nach verwendetem Build-Tool/IDE/Einstellungen sind die dazugehörigen Dateien direkt neben den Java-Dateien oder in getrennten Bereichen abzulegen.

Mit Class#getResource bzw. Class#getResourceAsStream kannst Du die betreffende Ressource dann ansprechen. Der anzugebende Pfad ist dann relativ zum Classpath.

Hört sich alles fürchterlich kompliziert an, ist aber im Endeffekt recht einfach.

Mal ein konkretes Beispiel. Sagen wir mal, Du möchtest sprite.png laden. Dieses legst Du in ein Paket org.javaforum.amsanan.images ab, d. h. unter src/org/javaforum/amsanan/images/sprite.png (bei Maven/Gradle wäre es src/main/resources/org/javaforum/amsanan/images/sprite.png).

Im Code kannst Du Dir dann eine URL zur Ressource mittels getClass().getResource("/org/javaforum/amsanan/images/sprite.png") geben lassen (man beachte, dass src/... dort nicht angegeben wird). Alternativ kannst Du auch einen InputStream erhalten, wenn Du getClass().getResourceAsStream(...) verwendest.

Hintergrund ist, dass Ressourcen zur Anwendung gehören. Wenn Du aus Deinem Spiel ein Jar-File erstellst, werden die Ressourcen dort mit rein gepackt. Am Code musst Du dann nichts ändern, d. h. die Ressourcen werden dann automatisch aus dem Jar-File geladen.
 

AmsananKING

Mitglied
Danke für die Antwort,
Bei meinem Code kann ich über ImageIO.read(file) in BufferedImage umwandeln und ich habe das so implementiert, dass mein FilenameFilter alle Dateien aus dem Package "Textures" mit png Endungen erkennen kann könnte ich, das so implementieren, dass der Filter im ersten Lauf aus dem Array key das erste Objekt bzw. den String "IDLE" mit dem Arraylist vergleichen kann und dann in einem Array(File[]) speichern kann.
Ich lade hier auch ein Bild des Projektes hoch, damit mein Problem vielleicht deutlicher wird.
Mit freundlichen Grüßen Amsi Screenshot (250).png
 

thecain

Top Contributor
Intellij markiert dir nicht zum Spass die hälfte gelb. Schau dir die Punkte doch mal an, vielleicht erledigt sich dein Problem dann vin selber...
 

AmsananKING

Mitglied
Danke für die Tipps,
Ich habe die Klasse neu sortiert und verbessert und habe nun eine doppelte Schleife genutzt um die Filepaths zu ordnen genau so geordnet wie die Strings im Array "Key".
P.S: Ich bin seit gestern erst auf diesem Forum online kann man diesen Thread für nicht mehr so wichtig einstellen.
Hier ist die Schleife:
[CODE lang="java" title="Doppelte Schleife"] for (int i=0;i<key.length;i++){
int count =i;
for (int j=0;j<filing.size();j++){
if (filing.get(j).getPath().contains(key[count])){
System.out.println(filing.get(j));
}
}
}[/CODE]
 

mihe7

Top Contributor
Bei meinem Code kann ich über ImageIO.read(file) in BufferedImage umwandeln und ich habe das so implementiert, dass mein FilenameFilter alle Dateien aus dem Package "Textures" mit png Endungen erkennen kann

Gerade das ist nicht der Fall: mit File werden Deine Bilder nicht aus einem Package, sondern aus dem Dateisystem geladen. Das fällt Dir spätestens auf die Füße, wenn Du die Anwendung außerhalb der IDE und ggf. außerhalb des Projektverzeichnisses starten willst. Der Ordner "src" steht dann nicht mehr zur Verfügung und Dein Programm findet keine Bilder mehr.

Schauen wir mal, wie lange das mit Deinen File-Arrays gut geht :)
 

AmsananKING

Mitglied
Okay Ich sehe das Problem, wie kann ich aus diesem Inputstream alle Bilder in eine BufferedImage Liste laden.
[CODE lang="java" title="Inputstream"] InputStream inputStream = getClass().getResourceAsStream("/net/Amsi/Textures");[/CODE]
 

mihe7

Top Contributor
ImageIO.read funktioniert auch mit Streams und URLs.

Java:
ImageIO.read(getClass().getResource("/net/Amsi/Textures/Bild.png"));
// oder
ImageIO.read(getClass().getResourceAsStream("/net/Amsi/Textures/Bild.png"));
 

AmsananKING

Mitglied
Irgendwie kriege ich das nicht so ganz hin, kann ich einen Inputstream erstellen um alle Images zu laden. Dazu noch eine Frage: kann ich den Inputstream eigentlich filtern.
Danke für die Hilfe.
[CODE lang="java" title="Inputstream"]Inputstream inp =getClass().getResourceAsStream("net/Amsi/Textures");[/CODE]
 

mihe7

Top Contributor
wenn ich 50 Bilder habe 50 Inputstreams erstellen.
Ja, aber nicht parallel.

Kann ich die Sprites vereinfachen? So dass ich eine Datei laden müsste?
Klar, Du kannst alle Sprites in ein großes Bild einfügen und aus dem Bild dann die betreffenden Bereiche (Sprites) rausziehen.

Am einfachsten wird es sein, wenn Du die Bilder systematisch benennst. Das scheint bei Dir sowieso der Fall zu sein: 1_entity_000_<key>_<nr>.png

Dann kannst Du einfach alle Resource-Namen erstellen, also etwa so:
Java:
private static final int PICS_PER_SPRITE = 7;
private Map<String, List<BufferedImage>> sprites = new HashMap<>();
....
for (String key : keys) {
    for (int seqNo = 0; seqNo < PICS_PER_SPRITE; seqNo++) {
        String resourceName = String.format("/net/Amsi/Textures/1_entity_000_%s_%03d.png", key, seqNo);
        BufferedImage image = ImageIO.read(getClass().getResource(resourceName));
        sprites.computeIfAbsent(key, k -> new ArrayList<BufferedImage>()).add(image);
    }
}
Damit kannst Du Dir per
Java:
sprites.get("DIE")
eine Liste der Bilder mit dem Key "DIE" geben lassen. Vom Design her ist das zwar nicht toll, sollte aber funktionieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G [LibGDX/Java] ArrayList Object Speicher Spiele- und Multimedia-Programmierung 3
gamebreiti Index eines Elements einer ArrayList abfragen Spiele- und Multimedia-Programmierung 1
M Arraylist füllen Spiele- und Multimedia-Programmierung 2
F Multithread-Arraylist-null pointer exception Spiele- und Multimedia-Programmierung 20
K Problem beim Anzeigen von Bildern Spiele- und Multimedia-Programmierung 5
J Anzeige von Bildern Spiele- und Multimedia-Programmierung 5
P Verwendung von JAI und das Splitten von Bildern Spiele- und Multimedia-Programmierung 4
M pixel perfect collision detection bei rotierenden Bildern Spiele- und Multimedia-Programmierung 13
T Bibliothek zum Verkleinern von Bildern (alle Fomate) Spiele- und Multimedia-Programmierung 3
A skallieren von Bildern Spiele- und Multimedia-Programmierung 8
Y Höhe und Breite von Bildern? Spiele- und Multimedia-Programmierung 4
D Probleme beim Download von GIF-Bildern Spiele- und Multimedia-Programmierung 4
M Tiefenwerte bei 2D Bildern abfragen Spiele- und Multimedia-Programmierung 3
G Polygonfläche vom Würfel mit Bildern füllen Spiele- und Multimedia-Programmierung 5
L Skalierung von Bildern mit Transparenz Spiele- und Multimedia-Programmierung 7
P 2D Spiel mir drehbaren Bildern (Sprites) programmieren Spiele- und Multimedia-Programmierung 10
P Problem mit PNG Bildern Spiele- und Multimedia-Programmierung 16
T Collision mit Bildern Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben