Sprite läuft durch mauer?
Hallo,
ich arbeite grad an einem info Projekt bei dem wir in einer online ide ein spiel programmieren müssen. Meine gruppe hat sie ein spiel überlegt bei dem die map ein Querschnitt von einem haus darstellt. Der Spieler spielt einen sprite also halt einfach eine figur. Folgendes Problem: dieser sprite läuft durch die mauern auf unserer map durch. Wie kann ich es programmieren dass dies nicht passiert
1 Antwort
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.