# 2D Spiel Welt scrollen bzw Image erweitern



## 0plan (11. Aug 2011)

Hallo leute, ich hab hier vorher schon ein bisschen rumgesucht und auch ähnliche Anfragen zu dem Thema gefunden, jedoch hat ich keine Lösungswege bzw Beispiele gefunden.

Ich möchte ein 2D Spiel a la Age of Wonders programmieren, Spiel Logik und Klassen hab ich bereits alle mit Stift und Papier definiert, wie ich vorgehen muss weiss ich auch. Das Problem welches ich nun aufgrund meiner eher geringfügigen Erfahrung mit größeren Spielen in Java habe ist, dass ich nicht weiss, wie ich z.B. das Spieler Objekt durch eine Welt bewegen kann, welche allerdings im GamePanel nicht komplett gezeigt wird. 

Beispiel:

Ich habe eine Map (mit tiled oder einfach ein Image) und mein Frame zeigt nur einen gewissen Bereich des Bildes an, wenn ich an die Border gelange, soll das Bild sich scrollen und ein weiterer Teil sichtbar werden, also quasi wie Sidescrolling nur halt in alle Richtungen. Kennt jemand Codebeispiele oder weiss, wie ich das am besten Umsetzen kann? Ich möchte bis auf Slick ziemlich gern bei der Standart-Api bleiben.

Mfg


----------



## Quaxli (12. Aug 2011)

0plan hat gesagt.:


> ...
> Beispiel:
> 
> Ich habe eine Map (mit tiled oder einfach ein Image) und mein Frame zeigt nur einen gewissen Bereich des Bildes an, ....
> ...



Ein einzelnes Image wird vermutlich nicht (performant) funktionieren. Du wirst Dir Deine Map aus Tiles aufbauen müssen.
Um die Bewegung auf einer großen Karte zu realisieren mußt Du den Hintergrund bewegen. Ich versuche mal grob einen Ansatz zu skizzieren, wie ich es machen würde:

- die Tiles werden in einem Array oder einer Collection gespeichert. (Die Tiles erben von Rectangle2D)
- den sichtbaren Bereich würde ich als Klasse "View" definieren. Diese erbt von Rectangle2D
- wenn nun der sichtbare Bereich verschoben wird, berechne ich die Bewegung zunächst auf die View-Klasse
- danach wird geprüft, welche Tiles sich mit der View-Klasse überschneiden (Methode intersects(...) von Rectangle geerbt)
- danach werden die Tiles gezeichnet. Dabei muß man berechnen, inwieweit diese verschoben werden müssen, um korrekt positioniert zu sein. Gggf über den sichtbaren Bereich hinaus.

Hier mal ein Beispiel








Die schwarzen Kästchen sind das Array mit den Tiles.
Die rote Box ist der sichtbare Bereich der schon etwas verschoben wurde.
Der grüne Kasten beinhaltet die Tiles, die sich mit dem sichtbaren Bereich überschneiden und gezeichnet werden müssen.

Nehmen wir mal an die Tiles sind 50 x 50 Pixel groß. Zur Erinnerung: Alle Tiles und der sichtbare Bereich erben von Rectangle2D und werden definiert druch x,y,Breite,Höhe, wobei x,y die linke obere Ecke definiert. Das Tile links oben wird also definiert durch 0,0,50,50 (vlg. API - Konstruktor von Rectangle2D). Das daneben mit 50,0,50,50 usw. .

Der sichtbare Bereich (rot) war ursprünglich oben links bei 0,0 und wurde jetzt durch Bewegungen des Spielers verschoben, nach ungefähr 75,75. 
Der grüne Kasten markiert alle Tiles die, zumindest teilweise, sichtbar sind. Dies können mit der intersects-Methode, die von Rectangle2D geerbt wurde gefunden werden.
Das Tile in der linke oberen Ecke des grünen Kastens wurde ursprünglich mal bei 50,50 gezeichnet. Dadurch daß der sichtbare Bereich (roter Kasten) verschoben wurde, muß es jetzt bei -25,-25 gezeichnet werden, damit es korrekt angezeigt wird, um die Bewegung des Spielers zu simulieren.

Das ist es, so im Groben. Da ein Spiel natürlich nicht nur aus Hintergrund besteht, mußt Du die Positionsanpassung natürlich für alle Objekte durchführen, wenn gescrollt wrid.
Ob Du jetzt permanent scrollst oder dann wenn Deine Figur den Rand erreicht, ist dabei erstmal zweitranging.


----------



## 0plan (12. Aug 2011)

Super! Vielen vielen Dank für diese ausführliche Antwort hat mir sehr geholfen. Ich werden mal versuchen deinen Vorschlag mit meinen Kenntnissen zu verbinden und umzusetzen. Den Thread lasse ich für weitere Fragen offen, denke mal, da werden noch Rückfragen kommen. Danke erstmal!!!


----------

