Hallo Community,
...
Mein Problem bei dem aktuellen scrolling ist, dass die figur sich schneller bewegt als die karte im Hintergrund. Meine Grund Idee war, dass die Spielerposition immer absolut in der Mitte ist.
...
[/code]
Warum bewegst Du die Figur dann, wenn Sie doch in der Mitte bleiben soll?
Lösungsvorschlag von mir:
- die Figur (mit all ihren Animationen) bleibt immer in der Mitte und wird nicht bewegt.
- die Bewegung wird durch eine virtuelle Klasse übernommen, nennen wir sie mal MapDisplay. Diese erbt von Rectangle2D.Double und bekommt noch alle notwendigen Methoden um eine Bewegung simulieren zu können. Im einfachsten Falle wäre das bei horizontaler Bewegung x+1 (oder so) pro Gameloop.
- bei jedem GameLoop berechnet die Klasse MapDisplay, welche Tiles in Abhängigkeit Ihrer virtuellen Position sichtbar ist und zeichnet dieses an die korrekte Stelle.
Schon wird Bewegung simuliert ohne daß Deine Figur sich bewegt hätte.
Klingt kompliziert? Ist es nicht. Anbei eine kleine Grafik und noch mehr Text zur Verdeutlichung.
(Die Zeichnung ist NICHT maßstabsgetreu!!!)
Die weißen Rechtecke sind Deine Tiles (erben auch von Rectangle2D.Double -aber das nur nebenbei). Das Tile links oben in der Ecke steht an Postion 0,0. (Und bleibt auch immer da)
Nehmen wir eine Tilegröße von 32 an, dann hätte das daneben 0,32. Und so weiter und so fort. Das sollte ja klar sein.
Der rot eingefärbte Bereich repräsentiert die Klasse MapDisplay. Dies ist Dein virtueller Bildschirm. Das was aktuell angezeigt wird. Sie erbt wie gesagt von Rectangel2D.Double und wir nehmen an, aß sie in dem Beispiel erzeugt worden ist mit einer Position bei 0,0 und einer Breite von 800 und eine Höhe von 600 (je nachdem wie groß Deine Zeichenfläche halt ist).
In der Beispielgrafik hat sich der Spieler schon ein Stück bewegt und virtuell den rot eingefärbten Bereich erreicht. Real steht er natürlich noch immer in der Mitte des Bildschirms.
Alles was rot ist, müßte jetzt angezeigt werden.
Um heraus zu bekommen, welche Tiles aktuell angezeigt werden müssen, muß man wissen welche Tiles sich mit dem sichtbaren Bereich überschneiden. Da Tiles und MapDisplay von Rectangle erben, geht das ganz einfach mit intersects(). Man erhält alleTiles, die sich mit unserem sichtbaren Bereich zumindest ein bißchen überschneiden. In der Zeichnung sind das alle, die mit einem grünen Rand eingefaßt sind. Alle diese Tiles müssen zumindest teilweise (tileweise?
) gezeichnet werden.
Und das war's dann auch schon fast:
Danach muß man nur noch ein bißchen rechnen, um die Tiles an der richtigen Position anzuzeigen. Das ist aber relativ einfach. Nehmen wir an die Tilegröße ist 32. Das Tile links oben hat immer noch die Postion 0,0.
Der sichtbare Bereich (rot) ist durch die Bewegung der Figur gewandert. Und liegt grob geschätzt bei 50,50 (ist als Beispiel einfacher zu berechnen
). (Und wie gesagt, die Zeichnung ist nicht maßstabsgerecht).
Eines der zu zeichnenden Tiles wäre das links oben im grünen Rahmen (grün = Summe der benötigten Tiles). Dieses Tile steht prinzipiell an der Positon 32,32. Damit es richtig gezeichnet wird (teilweise außerhalb) muß es verschoben werden.
Die linke obere Ecke unseres sichtbaren Bereichs (also der Klasse MapDisplay) liegt ja durch die Bewegung bei 50,50. Demnach ergibt sich für das o. g. Tile eine Position von 32 - 50 (jeweils für x und y). Und damit temporär eine andere Position. Das erste sichtbare Tile wird also nicht bei 32,32 gezeichnet, sondern bei -27,-27 - und damit korrekt angezeigt. Nämlich so, daß für uns nur der kleine rot gefärbte Bereich in unserer linken oberen Ecke zu sehen ist.
Diese Berechnung für alle sichtbaren Tiles (grüner Bereich) verschiebt Deinen Hintergrund gemäß der Bewegung des Spielers.
So, ich hoffe das ist jetzt einigermaßen verständlich beschrieben. Viel Spaß.