Beste methode zur Map Erstellen in "Block" Games

Hallo.
Ich wollte mal zur Übung ein Kleines “Rogue-like” schreiben, also ein kleines Spiel mit Pixel Grafik und blockbasierten Maps.
Nun da ist eine Frage offen: Wie mache ich am besten die Map? Also ich will zum Beispiel auch Strukturen haben wie Räume, Shops, Seen und was weiss ich.
Empfiehlt es sich die Map (wenn diese nicht zufällig generiert werden soll) Einfach so aufzubauen: (0: grass, 4: see, 5: strasse)

int map[] = {
      0, 0, 0, 4, 4, 4, 4, 0, 0, 0
      0, 0, 4, 4, 4, 4, 0, 0, 0, 5
      0, 0, 4, 4, 4, 0, 0, 0, 0, 5
      0, 4, 4, 0, 0, 0, 0, 0, 0, 5
      0, 0, 0, 0, 5, 5, 5, 5, 5, 5 
}

Und so weiter?
Dann müsste ich ja in der paint folgendes tun:

for(int i = 0; i < map.length; i++){
    for(int j = 0; j < map[0].length; j++){
         graphics.drawImage(blocks[map**[j]]);
    }
}

Also an die die mehr erfahrung damit haben: Wie macht man das am besten?

Danke!

Hi,

prinzipiell kann man das so machen. Ich würde sogar direkt richtige Objekte in das Array tun.

Sowas wie ein abstraktes WorldObject.

public abstract class WorldObject {

	public abstract boolean isAccessible();
	
	public Object getImage () {
		return null;
	}
}

Davon könnte man dann Implementierungen erstellen:

public class Rock extends WorldObject {

	@Override
	public boolean isAccessible() {
		return false;
	}
	
	@Override
	public Object getImage() {
		return "<R>";
	}

}

Das könnte zum Beispiel die Methode „isAccessable“ oder sowas verlangen, die dann Angibt, ob man da drauf kann oder nicht.

Auch könnte man hier mit „getImage“ das entsprechende Image zurückgeben.

Dann kann man sich eine „Welt“ vorstellen, die ein Array oder eine Liste der Weltobjekte bereitstellt:

public class World {

	private WorldObject[][] myWorld = new WorldObject[][] {
		{new Rock(),new Rock(), new Rock(),new Rock()},
		{new Free(),new Free(), new Free(),new Free()},
		{new Free(),new Rock(), new Rock(),new Free()},
		{new Free(),new Rock(), new Rock(),new Free()}
	};
}

Anschließend braucht man hier nur über das Array iterieren und entsprechend die Welt Zeichnen, indem man immer „getImage“ aufruft. Hier in dem Beispiel ist es ein Text, der gerendert werden müsste.

Gruß,

Martin

P.S. Das hier ist kein Übergangsforum. Das JF - Forum wurde von einer Firma übernommen, die damit Profit machen möchte. Da ich, und andere, dies nicht unterstützen wollen, sind wir in dieses Forum gezogen :wink:

Achso - okay :slight_smile:
Aber wie konnte das forum denn einfach „uebernommen“ werden?

Hmm danke erstmal. Irgendwie habe ich mir das anders vorgestellt. Ich weiss nicht wie genau aber… vielleicht kann man sich ja einen level editor schreiben? :smiley:
Aber man kann sich ja auch erstmal an die zahlen halten umnd den spaeter anhand dieser die welt aufbauen oder?

Wenn sich die Objekte nicht unterscheiden bzw. es sich nicht um „Individuen“ handelt, reicht es auch diese einmalig zu instanzieren und im Array wieder zu verwenden.
Alternativ finde ich das int auch nicht verkehrt. Die passenden Objekte dazu kann man ja in einem zweiten Array unter dem passenden Index halten.

bzgl. Deines Coss-Posts:

Ich würde das als Zensur bezeichnen… will hier aber niemandem etwas unterstellen.

jf ist mittlerweile ein gewerblich betriebenes und zentral gesteuertes Forum.
Bei byte-welt.net handelt es sich um ein ehrenamtlich betriebenes Forum, welches seinen Mitgliedern Mitsprache und Mitgestaltung ermöglicht.

[QUOTE=mymaksimus]Hmm danke erstmal. Irgendwie habe ich mir das anders vorgestellt. Ich weiss nicht wie genau aber… vielleicht kann man sich ja einen level editor schreiben? :smiley:
Aber man kann sich ja auch erstmal an die zahlen halten umnd den spaeter anhand dieser die welt aufbauen oder?[/QUOTE]

Nein, du hast dir das genau so vorgestellt.

Es ist nur eine kleine Erweiterung meinerseits. Ich würde von einem Leveleditor erstmal absehen und überhaupt statisch ein Männchen durch den Editor schieben.

Nur eines sollte man zu beginn wissen: Entweder man nimmt Zahlen und codiert so die Möglichkeiten eines Tiles oder man nimmt Objekte (in einer objektorientierten Sprache). Die Objekte sind natürlich trivial zu erweitern, während deine Zahlen in einem komplexer werdenen gebilde immer eine endlos „if-else“ Kombination hervorufen.

Man kann natürlich das weiter optimieren, wie _Michael es sagte hinsichtlich der Instanzen der Objekte.

Versuch erstmal etwas zu bauen, was leere Felder und Rocks unterscheiden kann und ein weiteres „Movable“ - Tile, dass dein männchen darstellt.

Gruß,

Martin

ABer der spieler ist ja eher ein eigebes objekt und kein teil… ^^
Aber gut, ich versuchs

Hier gibt es auch ganz gute Anregungen:

bzw

Ich bin damals bei ApoHarry ähnlich vorgegangen wie Marcinek es beschrieben hat für den Untergrund: ein drei-dimensionales Array mit den Objekten. Ich habe drei Dimensionen genommen, um verschiedene Ebenen benutzen zu können, um Detailsachen hinzuzufügen und Dreck etc.
Die Bilder in diesem Tutorial beschreiben es ganz gut (einfach nach unten scrollen).

Die eigentlichen beweglichen Objekte (Spieler, Gegner, NPC etc) habe ich extra in einer Liste gespeichert, sie bewegt und geschaut, ob sie an diese Position im Array dürfen oder nicht.

Hallo! Deine Herangehensweise, die Karte als zweidimensionales Array zu repräsentieren, ist durchaus gültig und wird in vielen Spielen verwendet. Allerdings gibt es ein paar Punkte zu beachten.

In deinem Beispiel verwendest du ein einfaches Array (int map[]), aber eigentlich wäre ein zweidimensionales Array (z.B. int map[][]) für ein Spielbrett oder eine Karte besser geeignet, weil du dann Koordinaten (x, y) anstelle von nur einem Index hast.

Zum Beispiel:

javaCopy code

int[][] map = {
    {0, 0, 0, 4, 4, 4, 4, 0, 0, 0},
    {0, 0, 4, 4, 4, 4, 0, 0, 0, 5},
    {0, 0, 4, 4, 4, 0, 0, 0, 0, 5},
    {0, 4, 4, 0, 0, 0, 0, 0, 0, 5},
    {0, 0, 0, 0, 5, 5, 5, 5, 5, 5} 
};

Dann wäre der Zeichenzyklus etwas wie:

javaCopy code

for(int i = 0; i < map.length; i++){
    for(int j = 0; j < map[i].length; j++){
         graphics.drawImage(blocks[map[i][j]], j * blockWidth, i * blockHeight, null);
    }
}

Dabei sind blockWidth und blockHeight die Breite und Höhe eines jeden Blocks (bzw. Pixel) auf deiner Karte.

Diese Methode funktioniert gut für einfache Karten und ist sehr intuitiv. Sie hat jedoch ihre Grenzen, wenn du komplexere Kartenstrukturen oder mehrschichtige Karten (wie Höheninformationen oder unterschiedliche Bodentypen) erstellen möchtest. In solchen Fällen könntest du überlegen, eine fortgeschrittenere Datenstruktur oder ein Map-Editor-Tool zu verwenden.

Aber für den Anfang und zum Üben ist diese Methode absolut geeignet und du wirst damit gute Ergebnisse erzielen können. Viel Spaß beim Programmieren deines Spiels!

1 „Gefällt mir“

Hahahahah also ich hätte nicht damit gerechnet hier noch eine Antwort zu bekommen xD

Vielen Dank für deine Mühe, Tutenblaeser.

Knapp 10 Jahre später ist es echt witzig zu sehen, was für murks ich hier damals geschrieben habe…

1 „Gefällt mir“