Java Unendliche Map (JavaFX)

Lacritz

Lieutenant
Registriert
Okt. 2013
Beiträge
922
Heyho liebe CB'ler,

ich programmiere derzeitig ein 2D Spiel ähnlich zu Terraria.
Ich stehe derzeitig vor der Überlegung wie ich es schaffe das die Map immer exakt gleich aussieht (beim geladenen Bereich) & vor allem das die Map zumindest in der Breite unendlich ist.

Bisher sieht es wie folgt aus:
(1) ich initialisiere ein Arrray gebe das im Verhältnis von 10pixel = 1 Block besteht. Sprich ist die Höhe 1080 -> 108 Blöcke. Diese fülle ich mit integer die die Blocktypen repräsentieren.
(2) ich lese das Array mit meinem Render Algorithmus aus und male an die stelle ein Image mit der Größe 10x10

DERZEITIG:
(3) sobald mein character aus dem Bildschirm raus läuft taucht er auf der linken Seite und auf einer neuen Map auf.
-> Hier von möchte ich weg

EBENFALLS ZU ÜBERLEGEN:
Wie schaffe ich es die die Mitte der Scene zu bewegen? indem ich einfach den Array und ich die Scene immer nur auf Teile lege? Sprich ich lasse das Canvas mit dem character wandern?

Wie schaffe ich es das Array in der Breite unendlich werden zu lassen ohne es jedes mal neu zu initialisieren und die werte des Alten Arrays darein zu schreiben? -> Rechenintensiv
 
Und das kann ich Problemlos 2 Dimensional ansetzen und mit int werten an bestimmten Positionen setzen?
Aber ja , genau nach einem 2 Dimensionalem Dynamischen Array suche ich derzeitig
 
Sieht schon sehr stark danach aus! Danke !
 
Lacritz schrieb:
Heyho liebe CB'ler,
DERZEITIG:
(3) sobald mein character aus dem Bildschirm raus läuft taucht er auf der linken Seite und auf einer neuen Map auf.
-> Hier von möchte ich weg

[...]
Wie schaffe ich es das Array in der Breite unendlich werden zu lassen ohne es jedes mal neu zu initialisieren und die werte des Alten Arrays darein zu schreiben? -> Rechenintensiv

Im Moment hast du ein 2D-Array aufgebaut, was genauso groß ist wie der sichtbare Bereich. Hier liegt das Problem, wenn man also einen Block nach rechts scrollt, müsste man alles umkopieren.

Eine einfache Lösung ist die das 2D-Array einfach z.B. doppelt so "breit" zu machen wie der Bilderschirm (theoretisch reich auch 1 Block breiter. Dein Renderer rendert hiervon immer über einen Offset noch einen Teilbereich.

Scrollt der User jetzt nach rechts, dann kopierst du einfach die entsprechenden Blöcke rechts hin und korrigiert den Offset mit dem dein Renderer auf das 2D-Array zugreift. Die nicht sichtbaren Teile lädst du dann von Festplatte nach.

Wenn Du allerdings vorher schon weißt dass deine Welt nicht unendlich ist und Du ohnehin nicht von der Festplatte nachladen willst, dann könntest du einfach ein Riesearray mit der ganzen Welt aufbauen. Das ist vllt. nicht so elegant, aber sollte passen. So brauchst du das Array gar nicht mehr beschreiben zur Laufzeit (außer das Spiel ändert die Welt) Kannst ja einfach ausrechnen wieviel Platz du bräuchtest - so viel wird das nicht sein. Macht wie gesagt nur bei einer endlichen Welt Sinn.
 
Das hatte ich vorhin auch schonmal überlegt - einfach das Array 5x der Größe der Szene zu machen & sobald ich 1 Szenen Breite vom Ende des Arrays entfernt bin eben aus einer Datei einen neuen Teil generieren zu lassen - nur bin ich derzeitig überfragt wie ich das genau Angehen soll
 
Lacritz schrieb:
Das hatte ich vorhin auch schonmal überlegt - einfach das Array 5x der Größe der Szene zu machen & sobald ich 1 Szenen Breite vom Ende des Arrays entfernt bin eben aus einer Datei einen neuen Teil generieren zu lassen - nur bin ich derzeitig überfragt wie ich das genau Angehen soll

Also wenn du die Sachen nachladen willst, dann ist eine 5fache sichtbar Breite vllt. unnötig viel. Wieviel man mehr braucht hängt ja nur davon ab, wie schnell man scrollen können soll und wie hoch die Latenz beim Nachladen ist. Ich denke 2-fache Breite reicht da, das würde es dir erlauben um einen ganzen Bildschirm zu springen ohne auf das Laden warten zu müssen.

Die Idee hast du ja offensichtlich verstanden. Welcher Teil macht Dir denn Probleme beim "Angehen"? Das Nachladen in den nicht sichtbaren Teil des Arrays? Oder das gezielte Auslesen der sichtbaren Teile für den Renderer? Oder etwas anderes.

Einer der größten Herausforderungen wird das Synchronisieren von Scrollen und Nachladen sein, weil du das vermutlich in verschiedenen Threads wirst machen müssen, weil z.B. der User schon weitergescrollt haben könnte während die Daten geladen werden. Im schlimmsten Fall ist der neue Black weder im sichtbaren, noch im unsichtbaren bereich Deines Arrays. Ebenfalls wäre es ratsam eine Art Caching für die Blöcke einzuführen, weil wenn der User immer hin und herläuft, dann wäre es blöd wenn ständig nachgeladen wird.

Heute werde ich nicht mehr antworten können, aber morgen sicherlich, wenn du noch Fragen hast.
 
@ Banthor:

Schonmal vielen dank für deine Antworten - sind sehr Hilfreich:
Naja prinzipiell ist es bei einem kleinen grafisch Anfängerspiel nicht so wichtig denke ich mit mehreren Threads zu arbeiten - da es sich lediglich um eine Auflösung von 960x540 handelt und "gerade" einmal ca. 100 Objekte zu sehen sein werden i.d.R die alle 10x10pixel groß sind.

Es gibt zuerst einen Array den ich gerne 3-5x so groß machen würde wie die eigentlich zu rendernde Scene , damit dürfte ich eigentlich kein Problem bekommen denke ich.

Gerade habe ich ein Problem JSON richtig zu "installieren" und in mein Package aufzunehmen - da ich leider nicht ganz verstehe wie ich das entdecken muss um darauf per Import zurück zu greifen...
 
Ich möchte einfach mal das Stichwort "Ringpuffer" in den Raum werfen. Könnte gut sein, dass das genau das Richtige ist für dich in diesem Fall.
 
Zurück
Oben