# Scrolling einer 2D Map



## mavinatic (25. Aug 2014)

Hallo Community,

vor langer Zeit hatte ich mal einen ähnlichen Thread, worum ich mich über das Scrolling einer Map informieren wollte. Da der SourceCode sich grundlegend geändert hat, möchte ich an dieser Stelle einen neuen Thread eröffnen, da ich das Prinzip noch nicht ganz verstanden habe.

Gegeben ist eine Map mit x * y Tiles z.B. x = 25; y = 20. Ich habe nun eine Spielfigur, welche immer in der Bildschirmmitte gemalt wird (Frame.WIDTH / 2, FRAME.HEIGHT/2). Die Map wird nun mit einem gewissen "offset" gemalt. Der "offset" ist in Pixeln gemessen und entspricht beim Starten des Spiels und somit der Spielerposition (x = 0; y = 0) Frame.WIDTH / 2, Frame.HEIGHT /2.

Wie handhabe ich das nun mit anderen Spielfiguren, welche nicht von mir gespielt und bewegt werden? Irgendwie erscheinen diese nicht an der gewünschten Position? Muss dort auch der Offset einberechnet werden?


----------



## Gucky (25. Aug 2014)

Wie genau zeichnest du denn? Hat jede Figur eine relative Koordinate, die erst beim Zeichnen umgerechnet wird? Spontan würde ich sagen, dass das die beste Methode ist.

Das wäre dann so: absoluteXPosFigur = relativeXPosFigur + absoluteXPosMap
Und du bräuchtest keinen Offset mit einberechnen. Nur müsste die Map beim Scrollen immer die richtigen Koordinaten bekommen.

Du hast eine Klasse Map und der werden Koordinaten, eine Breite und eine Höhe übergeben und diese Klasse gibt dir die dazugehörigen Figuren und Formen inklusive absoluter Koordinaten zurück.




Oder wie machst du das?


----------



## lord239123 (25. Aug 2014)

Wenn du willst, kann ich dir mal ein Projekt von mir schicken, in dem ich auch am Anfang vor diesem Problem stand.
Es ist eine Art Pokemon-Spiel und bestimmt wirst du im Sourcecode Hilfe bei deinem Problem finden.


----------



## mavinatic (26. Aug 2014)

Das Problem besteht darin, dass ich eine Klasse "Sprite" habe, von denen alle Figuren abgeleitet werden und eine Klasse Map welche die Methoden drawLowerLayer(Graphics g, int xOffSet, int yOffSet); & drawUpperLayer(Graphics g, int xOffset, int yOffset); Dort kann ich nun den OFFSET meiner kontrollierten Figur angeben, dass sieht soweit schonmal gut uas, wenni hc das mache. Aber die Position der einzelnen Spielfiguren (nicht von mir gesteuert) haben eine Falsche position


----------



## Gucky (26. Aug 2014)

Ich habe keine Ahnung, wie du zeichnest.

Wo ist bei dir Koordinate (0,0)? Oben links im Frame, oben links im angezeigten Bereich oder oben Links in der Map?


----------



## mavinatic (26. Aug 2014)

Ich habe nun eine neue Methodik und zwar ich versetze mit Graphics.translate(int xOffset, int yOffset) den Koordinatenursprung. Nun wird aber mein UI auch versetzt und das zurückversetzen des Ursprungs ist leider nicht möglich :-( Habt ihr da zufälligerweise eine Lösung vllt parat? Aus oben gennante problem


----------



## Gucky (26. Aug 2014)

Und ob das möglich ist. 
Du translatest einfach zurück.

Aber Lord und ich haben beide mehrere Lösungsmöglichkeiten ersonnen und du baust dir eine Weitere und wunderst dich, wenn es nicht funktioniert.


----------



## Sogomn (27. Aug 2014)

```
g.translate(xOffset, yOffset);
{
   drawGame(g);
   //...
}
g.translate(-xOffset, -yOffset);
drawUI(g);
```


----------



## lord239123 (27. Aug 2014)

Hier ist der Link zum entsprechenden Thread, in dem ich mal den Downloadlink gepostet habe.
http://www.java-forum.org/spiele-und-multimedia-programmierung/162053-2d-spiel-ohne-tiles.html

Um zum Link zu kommen, musst du erst noch ein wenig runterscrollen.
Das ganze ist ein Eclipseprojekt, was du erst noch importieren musst.


----------

