2D-Side-Scrolling-Game in Chunks splitten

IWillTry

Mitglied
Hallo zusammen,

Ich bin gerade neu hier im Forum, sollte ich also was falsch machen oder im falschen Bereich posten, merkt es einfach an.

Ich bin derzeit dabei, ein Side-Scrolling Spiel ähnlich zu Terraria zu programmieren.
Ich benutze dazu JavaFX.
Da die Spielwelt in der Breite unendlich sein soll, dachte ich, wäre es am sinnvollsten, sie in CHunks aufzuteilen, die dann nach Bedarf nachgeladen werden.
Die Chunks sind 2D-Arrays, welche mit ganzen Zahlen gefüllt werden und dann ausgelesen werden. DIe Zahlen entsprechen dann jeweils einem Blocktyp, welcher dann gezeichnet wird.
Der Spieler liegt auf einer Zeichenebene über der Weltebene und wird immer mittig gezeichnet.
Bewegt sich der Spieler, so rutscht also die Welt unter ihm weg.

Ein Chunk ist 256 Blöcke hoch und 50 Blöcke breit (ein Block = 16x16 Pixel). Das Anzeigefenster ist zunächst fix eingestellt auf 800x800 Pixel.

Jetzt hänge ich an der Frage fest, wie ich den Teil des Chunks berechne, der gezeichnet werden soll, also quasi ab welchem Index die Zeichenfunktion anfangen soll das Array auszulesen und zu zeichnen.
Und wie lasse ich dann noch wenn ich mich bspw. 8px nach links bewege nur einen 8px breiten Teil des links neu generierten Chunks zeichnen?

Ich hoffe ihr versteht ungefähr, worauf ich hinausmöchte.

Vielen Dank schon mal im Voraus,

IWillTry
 

IWillTry

Mitglied
Hi,

mittlerweile habe ich es geschafft, dass die Chunks neu geladen werden.
Zwar crasht meine Gameloop immernoch beim Zeichnen, aber die ist erstmal Nebensache.

Nun zu meinem neuen Problem:
- die Chunks werden in Textdateien .txt gespeichert, in der Datei steht also das gesamte Int-Array, was das Chunk darstellt
- die Chunk-Dateien werden fortlaufend nummeriert, egal, ob ich links oder rechts nen neuen Chunk lade

=> wie prüfe ich nun vor dem Laden eines neuen CHunks nach, ob eine Datei mit dem gewünschten Namen bereits besteht?
==> wie lese ich die Datei zeilen/spaltenweise ein und speichere sie äquvalent in einem Array?
 

InfectedBytes

Top Contributor
Es wäre einfacher, wenn die Namen der Chunks bereits sinnvolle Informationen enthalten würden.
Du könntest z.B. die x-Koordinate des chunks im Namen speichern:
chunk_0.txt, chunk_-1.txt, chunk_42.txt, ...
Dadurch weißt du direkt ob der benötigte chunk bereits existiert oder nicht.
Außerdem könntest du dir überlegen, ob es vielleicht besser ist mehrere Chunks in einer Datei zu speichern, aber das muss nicht unbedingt besser sein.

Fürs laden kannst du dir ja mal den BufferedReader anschauen.
 

IWillTry

Mitglied
Hi InfectedBytes,

erstmal Danke für die Antwort :)
Das mit den Namen habe ich gestern noch geändert.
Die Namen werden jetzt theoretisch nach ihrem Abstand ihres Mittelpunktes zum absoluten Mittelpunkt benannt.
Allerdings wird beim zurückgehen noch nicht nach existierenden Chunks geprüft und ein falscher Name erzeugt.
Hier ein Beispiel der Bennennung: ich gehe nach links 0 (Startchunk) -> -8 (erster linker Chunk) -> -16 (jetzt drehe ich rum und gehe nach rechts) -> 8
Da stimmt wohl was mit meiner Benennung nicht. ICh werde euch wohl im Laufe des Tages nochmal mit etwas Code zutexten, wo ich einfach nicht den logischen Fehler finde.

Aber wie finde ich nun abhängig von der Position des Spielers raus, welcher Teil welches Chunks gezeichnet werden soll, damit nicht alles gezeichnet wird?
 

InfectedBytes

Top Contributor
Dein Fenster ist 800*800 groß und jeder Block ist 16*16 Pixel groß. Zuerst kannst du einmal berechnen aus wie vielen Blöcken das Fenster besteht: 800/16 = 50
Dein Fenster besteht also aus 50*50 Blöcken

Im Grunde sollten also links/rechts/oben/unten vom Spieler je 25 Blöcke sein.
Wenn du nun die globalen positionen vom Spieler und chunk voneinander abziehst, kennst du den Abstand der beiden voneinander und kannst entsprechend zeichnen.
Wenn der Spieler also z.B. auf dem 10. Block eines Chunks steht, müssen noch 15 Blöcke des linken Chunks gezeichnet werden und die Blöcke 0 bis 35 vom aktuellen Chunk.
 

IWillTry

Mitglied
Danke für die neue Antwort!
Ja so ungefähr habe ich mir das auch gedacht, die berechneten Werte von dir sind auch bereits schon alle als Variablen bzw. Konstanten gespeichert und finden schon Anwendung woanders. Ebenso wird die Spielerposition global korrekt berechnet. Allerdings funktioniert das Zusammenspiel noch nicht so ganz, da eine ganz andere Funktion nicht läuft und dadurch das Spiel zum abstürzen bringt.

Und zwar werden von Beginn an drei Chunks geladen: currentChunk (start und spawn-chunk, x-Wert der Mitte ist 0 und chunkNumber ist auch 0), leftChunk(chunkNumber = currentChunk.chunkNumer-1), rightChunk(entsprechend +1).
Dann sobald man über den Mittelpunkt des aktuellen Chunks hinausgeht (und so ein anderer Chunk sichtbar wird) wird im sichtbar werdenden Chunk die Variable drawable auf true gesetzt und die des auf der anderen Seite liegenden Chunks auf false (in deren Abhängigkeit wird gezeichnet oder nicht). Desweiteren wird sobald man einen Chunk z.B. nach links verlässt, der aktuelle Chunk auf den linken Chunk referenziert (die anderen rutschen entsprechend nach).
Hier der Code dazu:
Java:
[COLOR=#cc7832]
public void [/COLOR][COLOR=#ffc66d]checkChunks[/COLOR]() {

    [COLOR=#808080]// Player ist jetzt im linken Chunk
[/COLOR][COLOR=#cc7832]if[/COLOR]([COLOR=#9876aa]p[/COLOR].getPx() < [COLOR=#9876aa]currentChunk[/COLOR].getMiddlePX() - [COLOR=#6897bb]400[/COLOR]) {
        [COLOR=#9876aa]rightChunk [/COLOR]= [COLOR=#9876aa]currentChunk[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]currentChunk [/COLOR]= [COLOR=#9876aa]leftChunk[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]leftChunk [/COLOR]= [COLOR=#cc7832]new [/COLOR]Chunk([COLOR=#9876aa]currentChunk[/COLOR].getMiddlePX() - [COLOR=#6897bb]800[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]currentChunk[/COLOR].getChunkNumber() - [COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#6897bb]999[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]currentChunk[/COLOR].getChunkNumber()[COLOR=#cc7832], [/COLOR][COLOR=#9876aa]res[/COLOR])[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]currentChunk[/COLOR].setDrawable([COLOR=#cc7832]true[/COLOR])[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]rightChunk[/COLOR].setDrawable([COLOR=#cc7832]true[/COLOR])[COLOR=#cc7832];
[/COLOR]}
    [COLOR=#808080]// Player geht in den rechten Chunk
[/COLOR][COLOR=#cc7832]else if[/COLOR]([COLOR=#9876aa]p[/COLOR].getPx() > [COLOR=#9876aa]currentChunk[/COLOR].getMiddlePX() + [COLOR=#6897bb]400[/COLOR]) {
        [COLOR=#9876aa]leftChunk [/COLOR]= [COLOR=#9876aa]currentChunk[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]currentChunk [/COLOR]= [COLOR=#9876aa]rightChunk[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#9876aa] leftChunk [/COLOR]= [COLOR=#cc7832]new [/COLOR]Chunk([COLOR=#9876aa]currentChunk[/COLOR].getMiddlePX() + [COLOR=#6897bb]800[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]currentChunk[/COLOR].getChunkNumber() + [COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]currentChunk[/COLOR].getChunkNumber()[COLOR=#cc7832], [/COLOR][COLOR=#6897bb]999[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]res[/COLOR])[COLOR=#cc7832];[/COLOR][COLOR=#808080]
[/COLOR][COLOR=#9876aa]currentChunk[/COLOR].setDrawable([COLOR=#cc7832]true[/COLOR])[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]leftChunk[/COLOR].setDrawable([COLOR=#cc7832]true[/COLOR])[COLOR=#cc7832];
[/COLOR]}
    [COLOR=#808080]// linker Chunk wird sichtbar
[/COLOR][COLOR=#cc7832]else if[/COLOR]([COLOR=#9876aa]p[/COLOR].getPx() < [COLOR=#9876aa]currentChunk[/COLOR].getMiddlePX()) {
        [COLOR=#9876aa]leftChunk[/COLOR].setDrawable([COLOR=#cc7832]true[/COLOR])[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]rightChunk[/COLOR].setDrawable([COLOR=#cc7832]false[/COLOR])[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]currentChunk[/COLOR].setDrawable([COLOR=#cc7832]true[/COLOR])[COLOR=#cc7832];
[/COLOR]}
    [COLOR=#808080]// rechter Chunk wird sichtbar
[/COLOR][COLOR=#cc7832]else if[/COLOR]([COLOR=#9876aa]p[/COLOR].getPx() > [COLOR=#9876aa]currentChunk[/COLOR].getMiddlePX()) {
        [COLOR=#9876aa]rightChunk[/COLOR].setDrawable([COLOR=#cc7832]true[/COLOR])[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]leftChunk[/COLOR].setDrawable([COLOR=#cc7832]false[/COLOR])[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]currentChunk[/COLOR].setDrawable([COLOR=#cc7832]true[/COLOR])[COLOR=#cc7832];
[/COLOR]}
}

So... nun wird je weiter man nach links geht immer ein neuer CHunk benannt und dieser entsprechend benannt 0 -> -1 -> -2 ->... wenn ich nun aber zurückgehe, so wird der Chunk mit der Nummer 1 geladen und das ist ja falsch.... der Fehler muss eigentlich in obigen Code liegen... nur wo?
Außerdem lädt das Programm manchmal ganz plötzlich etliche Chunks und stürzt dann ab...

Hilfe :O

[EDIT:] Fehlermeldungen kommen keine (außer eine anderweitig auftretende BufferoverfloException)
 
Zuletzt bearbeitet:

IWillTry

Mitglied
Hier nochmal der Code:

Java:
public void checkChunks() {

        // Player ist jetzt im linken Chunk
        if(p.getPx() < currentChunk.getMiddlePX() - 400) {
            rightChunk = currentChunk;
            currentChunk = leftChunk;
            leftChunk = new Chunk(currentChunk.getChunkNumber() - 1, 999, currentChunk.getChunkNumber(), res);
            currentChunk.setDrawable(true);
            rightChunk.setDrawable(true);
        }
        // Player geht in den rechten Chunk
        else if(p.getPx() > currentChunk.getMiddlePX() + 400) {
            leftChunk = currentChunk;
            currentChunk = rightChunk;
            leftChunk = new Chunk(currentChunk.getChunkNumber() + 1, currentChunk.getChunkNumber(), 999, res);
             currentChunk.setDrawable(true);
            leftChunk.setDrawable(true);
        }
        // linker Chunk wird sichtbar
        else if(p.getPx() < currentChunk.getMiddlePX()) {
            leftChunk.setDrawable(true);
            rightChunk.setDrawable(false);
            currentChunk.setDrawable(true);
        }
        // rechter Chunk wird sichtbar
        else if(p.getPx() > currentChunk.getMiddlePX()) {
            rightChunk.setDrawable(true);
            leftChunk.setDrawable(false);
            currentChunk.setDrawable(true);
        }
    }

Die Fehler:

1. geht man mehrere Chunks nach links, so werden alle neuen linken Chunks korrekt benannt. Geht man dann jedoch einen Chunk zurück nach rechts, so wird der Chunk mit der Ziffer um 3 weiter rechts geladen/benannt.
==> Beispiel: Ich bin in Chunk -2, gehe einen Chunk nach rechts und lande in Chunk 1

2. geht man nach rechts über Chunk 2 hinaus, so lädt er endlos den Chunk 2 neu

Was ist da los?
habe bei dem Code einen Knoten im Hirn gehabt glaube ich..
 
Zuletzt bearbeitet:

InfectedBytes

Top Contributor
Ist nicht unbedingt der schönste code, aber das wird schon noch^^
Ansonsten könnte heir dein problem liegen:
Java:
leftChunk = currentChunk;
currentChunk = rightChunk;
leftChunk = new Chunk(currentChunk.getChunkNumber() + 1, currentChunk.getChunkNumber(), 999, res);
Anstatt den rechten Chunk zu erzeugen, überschreibst du nochmal den linken
 

IWillTry

Mitglied
Jop, den Fehler habe ich schon korrigiert, habe aber den Code aus der falschen Klasse gepostet -.- Sorry.
Leider hat das den Fehler auch nicht behoben :-/
Aber ich habe durch eine neue Gameloop die Abstürze behoben.
Der Fehler mit dem Laden der Chunks besteht aber leider immernoch..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
TheSorm 2D Side Scrool Platformer Spiele- und Multimedia-Programmierung 8
M Scrolling einer 2D Map Spiele- und Multimedia-Programmierung 8
Kenan89 Parallax Scrolling Spiele- und Multimedia-Programmierung 12
M Scrolling Repaint Problem Spiele- und Multimedia-Programmierung 2
I Timebased tile scrolling wirkt unsauber. Spiele- und Multimedia-Programmierung 7
P Frage zum Scrolling Spiele- und Multimedia-Programmierung 23
M Scrolling Spiele- und Multimedia-Programmierung 20
L Spider game, Ist es verloren? Spiele- und Multimedia-Programmierung 4
J SNAKE-GAME-LOOP / (Applet zu Application) Spiele- und Multimedia-Programmierung 4
P Snake Game Verbessern Spiele- und Multimedia-Programmierung 15
E Organisation für Game Spiele- und Multimedia-Programmierung 1
G [Game-Multiplayer] Welt vom Server zum Client senden. Spiele- und Multimedia-Programmierung 0
C 3d Game Engine : PERFORMANTE Räumliche Verdeckung Spiele- und Multimedia-Programmierung 5
R Durch String Platform Game erstellen Spiele- und Multimedia-Programmierung 8
G Component System Java 2D Game LibGDX Spiele- und Multimedia-Programmierung 6
G Collision Detection in einem 2D Sandbox Game. Spiele- und Multimedia-Programmierung 2
J Problem mit Game Of Life Spiele- und Multimedia-Programmierung 3
B "Snake"-Game Logikfehler Spiele- und Multimedia-Programmierung 1
R Game Loop verhält sich eigenartig Spiele- und Multimedia-Programmierung 1
H Game Crash Spiele- und Multimedia-Programmierung 7
B Game of Life: Was mache ich falsch? Spiele- und Multimedia-Programmierung 3
$ Einstieg in Java Game Development Spiele- und Multimedia-Programmierung 11
BraunBerry Java Game Pixel "einfärben" Spiele- und Multimedia-Programmierung 6
BraunBerry Java Game verbesserte Kollisionserkennung Spiele- und Multimedia-Programmierung 18
BraunBerry Java Game Waypoint System Spiele- und Multimedia-Programmierung 3
T Moddable Game Spiele- und Multimedia-Programmierung 6
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
T Game-Rendering Spiele- und Multimedia-Programmierung 5
Z 2D Pixer art RPG Game - Alpha auf Indie DB spielbar Spiele- und Multimedia-Programmierung 0
F Game of Life Spiele- und Multimedia-Programmierung 1
S Game/Cheat Spiele- und Multimedia-Programmierung 20
wolfgang63 Mit JavaFX einfaches Game programmieren Spiele- und Multimedia-Programmierung 5
D Textfield im Game ,Problem: while-Schleife Spiele- und Multimedia-Programmierung 3
O Pause Menu im 2D Game, bitte um Rat! Spiele- und Multimedia-Programmierung 4
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
K Online Game? Spiele- und Multimedia-Programmierung 1
R Game Loop scheitert.. Spiele- und Multimedia-Programmierung 2
Androbin Verschwindender Spieler in 2D-Game Spiele- und Multimedia-Programmierung 7
Sogomn Game Loop Spiele- und Multimedia-Programmierung 2
M Jump 'n' Run Game - Blöcke? Spiele- und Multimedia-Programmierung 7
J Verständnissfragen zur Game-Loop Spiele- und Multimedia-Programmierung 2
N Game GUI Programmieren Spiele- und Multimedia-Programmierung 16
Black_ixx ManaWar Action Game Spiele- und Multimedia-Programmierung 5
M Multiplayer-Game auf Website Spiele- und Multimedia-Programmierung 2
M Multiplayer Game mit Frontend auf HTML5 - ohne ständigen Client Request - Möglich?! Spiele- und Multimedia-Programmierung 12
P Mein Android Game Spiele- und Multimedia-Programmierung 3
N Animationen für ein 2D game Spiele- und Multimedia-Programmierung 6
S Problem mit Zeitsteuerung der Game Loop Spiele- und Multimedia-Programmierung 4
Kenan89 Kleines Game Spiele- und Multimedia-Programmierung 26
M Vektor Game Spiele- und Multimedia-Programmierung 13
F Bot updaten von einem Browser game Spiele- und Multimedia-Programmierung 7
Samake03 [Game]"Plumbo - Lost in Depth" Preview und Fragen Spiele- und Multimedia-Programmierung 18
K Game Engine für selbstprogrammiertes Spiel Spiele- und Multimedia-Programmierung 27
A Music für Android game Spiele- und Multimedia-Programmierung 3
A Wie wird die Person im Game animiert, dass sie ihre Körperteile bewegen? Spiele- und Multimedia-Programmierung 3
K 3D Game wie Minecraft Spiele- und Multimedia-Programmierung 3
T Torquemada´s erstes Game (Pong) Spiele- und Multimedia-Programmierung 5
X Möglichst komplette 2D Game Engine? Spiele- und Multimedia-Programmierung 12
Kr0e Red Dwarf Game Server Spiele- und Multimedia-Programmierung 5
M Euer erstes Game Spiele- und Multimedia-Programmierung 16
M Netzwerk-Game mit UDP Spiele- und Multimedia-Programmierung 8
ruerob Eure Meinung über Applet-game Spiele- und Multimedia-Programmierung 12
J das erste Game Spiele- und Multimedia-Programmierung 2
M Einen Hobby Game - / Grafik Designer zu finden (Screenshot vom Spiel) Spiele- und Multimedia-Programmierung 7
S Game Client für kleine Competition Spiele- und Multimedia-Programmierung 3
J 2D-Game-Engine? Spiele- und Multimedia-Programmierung 2
F Game mit LWJGL/JOGL in executable JAR packen, wie? Spiele- und Multimedia-Programmierung 6
P 2D Game - Alternative zur TileMap? Spiele- und Multimedia-Programmierung 2
W Memory Game Spiele- und Multimedia-Programmierung 4
Steev EGE - Easy Game Engine Spiele- und Multimedia-Programmierung 2
Developer_X X-Shooter Game Spiele- und Multimedia-Programmierung 21
C 2D Multiplayer Game Spiele- und Multimedia-Programmierung 5
O Mein erstes Game Spiele- und Multimedia-Programmierung 10
Developer_X PingPong-the Game by Developer-X Spiele- und Multimedia-Programmierung 170
K My First Game "ORB" vielen Dank Quaxli Spiele- und Multimedia-Programmierung 23
hdi Das java-forum.org 2D-Game Projekt/Tutorial Spiele- und Multimedia-Programmierung 6
hdi Quiclix : Game download Spiele- und Multimedia-Programmierung 5
A Java 2D Game Spiele- und Multimedia-Programmierung 4
K Game-Tutorial von Quaxli Fragen Spiele- und Multimedia-Programmierung 18
G Suche passende Game api Spiele- und Multimedia-Programmierung 9
K Java Game Programming Buch Spiele- und Multimedia-Programmierung 3
C Hilfe bei einfachen Game Spiele- und Multimedia-Programmierung 15
L Kleines RTS Game -> Netzwerkproblem Spiele- und Multimedia-Programmierung 5
P Suche Leute für ein Hobby-Projekt (Browser Game) Spiele- und Multimedia-Programmierung 4
Q online game programieren Spiele- und Multimedia-Programmierung 8
G Welche Game Api Spiele- und Multimedia-Programmierung 9
S 3d applet - online game Spiele- und Multimedia-Programmierung 4
C Open-Source Game Spiele- und Multimedia-Programmierung 2
sparrow 3D-Game-Engine Spiele- und Multimedia-Programmierung 20
J Isometric Tile Game (x,y) inklusive Z cordinaten? Spiele- und Multimedia-Programmierung 2
M Java online multiplayer game Spiele- und Multimedia-Programmierung 2
J java netzwerk strategie game programmiert Spiele- und Multimedia-Programmierung 4
D Jump and Run Game -- Kollisionsabfrage Spiele- und Multimedia-Programmierung 30
B Snake-Game fürs Handy Spiele- und Multimedia-Programmierung 3
F Online Game mit Java? Spiele- und Multimedia-Programmierung 11
M Space PingPong Game --> Performance ok? Spiele- und Multimedia-Programmierung 44
R 2D Game Oberfläche. Wie am besten? Spiele- und Multimedia-Programmierung 2
H LWJGL - Lightweight Java Game Library! Ist Java3D jetzt out? Spiele- und Multimedia-Programmierung 4

Ähnliche Java Themen

Neue Themen


Oben