Greenfoot/Java: Wie kann ich meiner Welt schneller und mit weniger Code mehrere Aktoren zufügen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Ich würde eine Matrix anlegen, die die Map repräsentiert.

Beispiel:

int[][] map = new int[][] {
  { 1, 1, 1, 2 },
  { 1, 0, 0, 2 },
  { 1, 0, 0, 2 },
  { 1, 2, 2, 2 }
};

Jede 1 steht für eine Wand 1, jede 2 für eine Wand 2. Im Beispiel habe ich die Zahlen willkürlich verteilt, da ich nicht weiß, wie sich die Wandtexturen bei dir konkret unterscheiden.

Alternativ könnte man die Map auch in einer Textdatei aufführen,

1, 1, 1, 2
1, 0, 0, 2
1, 0, 0, 2
1, 2, 2, 2

die vor Spielstart vom Programm eingelesen wird.

Im Anschluss fügt man die Wände via Schleife der Welt zu.

String[] imagePaths = new String[] { "Wall-1.png", "Wall-2.png" };
int fieldSize = 10;

for (int y = 0; y < map.length; ++y) {
  for (int x = 0; x < map[y].length; ++x) {
    String imagePath = imagePaths[map[y][x] - 1];
    var wall = new WallType(x * fieldSize, y * fieldSize, imagePath));
    // add to world ...
  }
}
Phoenixxx14 
Fragesteller
 05.06.2023, 14:09

Weißt du zufällig, wie ich die Wände noch gedreht bekomme und ich diese Textdatei initialisieren kann?

0
regex9  05.06.2023, 19:28
@Phoenixxx14

Die Bilder kannst du doch in einem Bildbearbeitungsprogramm so vorbereiten, wie du sie brauchst. Wenn es am Ende deshalb 8 Bilder sind, vergibst du in der Map eben die Zahlen 0-8 (Grenzen inklusiv).

Zum Dateilesen müsstest du mit den Elementen aus der Java-Standardbibliothek arbeiten.

Die Files-Klasse verfügt über eine Methode, um auf einfachem Wege alle Zeilen einer Datei einzulesen:

List<String> getMapDataFromFile(String filepath) {
  Path path = Paths.get(filepath);

  try {
    return Files.readAllLines(path, StandardCharsets.UTF_8);
  }
  catch (IOException ex) {
    ex.printStackTrace();
    return new ArrayList<String>();
  }
}

Die genutzten Klassen kommen aus den Packages java.nio.file und java.nio.charset.

Durch die einzelnen Zeilen kann man anschließend durchlaufen und sie jeweils an ihrem Separator auftrennen. Jeder dieser Teilstrings wird anschließend zu einer Zahl gecastet und in die Map gelegt.

int[][] getMap() {
  List<String> lines = getMapDataFromFile("map.txt");
  int rowCount = lines.length;

  if (rowCount < 1) {
    System.err.println("No map data could be loaded.");
    return new int[0][0];
  }

  final String separator = ", ";
  int columnCount = lines[0].split(separator).length;
  int[][] map = new int[rowCount][columnCount];

  for (int row = 0; row < lines.length; ++row) {
    String[] fields = lines[row].split(separator);

    for (int column = 0; column < fields.length; ++column) {
      try {
        map[row][column] = Integer.parseInt(fields[column]);
      }
      catch (NumberFormatException ex) {
        map[row][column] = 0;
        System.err.printf("Parse error at: %d, %d, value: %d%n", row, column, fields[column]);
      }
    }
  }

  return map;
}
1
Phoenixxx14 
Fragesteller
 05.06.2023, 19:59
@regex9

Ok vielen vielen Dank, das funktioniert sehr gut :)

0