Sprite läuft durch mauer?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Dein Programm muss selbst die Map, bzw. die un-/begehbaren Bereiche kennen. Immer wenn sich deine Figur bewegen soll, muss geprüft werden, ob sie sich auf eine unbegehbare Fläche bewegt oder nicht. Wenn ja, müsste es eine Gegenmaßnahme geben (Reduzierung der Spielergeschwindigkeit auf 0 o.ä.).

In Java könnte man sich ein zweidimensionales Array anlegen, welches die Karte (in Form eines Rasters) abbildet (= Tilemap). Jedes Element im Array entspricht also einem Feld im Raster.

Beispiel:

boolean[][] map = {
 { false, true, true },
 { true, true, false },
 { false, false, false },
};

In dieser einfachen Form würde false für ein unbegehbares Feld und true für ein begehbares Feld stehen.

Bestenfalls wird dieses Array nun nicht nur zur Prüfung bei Spielerbewegungen herangezogen, sondern ebenso an den Zeichenprozess gekoppelt.

Beispiel bei einer Ausgabe auf der Konsole:

for (int y = 0; y < map.length; ++y) {
  for (int x = 0; x < map[y].length; ++x) {
    System.out.print(map[y][x] ? " " : "#");
  }

  System.out.println();
}

Für komplexere Maps könnte man statt mit boolschen Werten entweder Zahlen nutzen, die jeweils verschiedene Feldtypen kennzeichnen (z.B. 0 für Blöcke, 1 für Gras, 2 für Schnee, ...) oder eine eigene Feldklasse anlegen.

enum FieldType { GRASS, SNOW, WALL, /* ... */ }

class Field {
  private final FieldType fieldType;

  public Field(final FieldType fieldType) {
    this.fieldType = fieldType;
  }

  /* ... */
}

// map:
Field[][] map = {
  { new Field(FieldType.WALL), new Field(FieldType.GRASS), new Field(FieldType.GRASS) },
  { new Field(FieldType.GRASS), new Field(FieldType.GRASS), new Field(FieldType.WALL) },
  { new Field(FieldType.WALL), new Field(FieldType.WALL), new Field(FieldType.WALL) }
};

Alternativ zu einem Array (bzw. einer Tilemap) könnte man ein Spielfeld ebenso mit einem Quadtree abbilden, dem man entweder nur die Koordinaten der begehbaren oder andersherum, nur der unbegehbaren Bereiche mitteilt.

Für Programmieranfänger ist die Arraylösung allerdings wesentlich einfacher.