# Parallax Scrolling



## Kenan89 (17. Mai 2012)

Hallo,
wie der Name sagt, möchte ich, dass die Map mit scrollt. 
Ich habe leider überhaupt keinen Ansatz und habe auch keine Tutorials für Java bzgl. dieser Thematik gefunden.

Danke für Hilfen im voraus.


----------



## fastjack (17. Mai 2012)

Ich kenne Parallax-Scrolling nur aus 2d-Sidescrollern (Turrican, Uridium, ...). Du verschiedene Scrollbereiche, z.B. vorne, mitte und hinten, die scrollen verschieden schnell, oder auch in verschiedene Richtungen (links-rechts) usw. Google ist doch voll damit...


----------



## Kenan89 (18. Mai 2012)

die map soll ja horizontal und vertical bis zu einer Obergrenze scrollbar sein. (Die Spielkarten von mir haben nämlich Grenzen, z.b. in einem großen haus, der so lange scrollt bis man gegen eine wand läuft.)


----------



## Kenan89 (18. Mai 2012)

Hier noch einmal in Bild, was ich meine:







Der dunkelgrüne Bildschirm ist der Bereich der Kamera. Die soll mit bewegung der Figur nach rechts mit nach rechts rücken.


----------



## DrunkenMastered (19. Mai 2012)

Hast du denn schon irgendeinen Ansatz?


----------



## fastjack (20. Mai 2012)

Das ist aber kein Parallaxscrolling, sondern normales.

Beim Parallax hast Du z.B. sowas:


```
|------------------------------|
| Bereich 1                    |
|------------------------------|
|                              |
| Bereich 2                    |
|                              |
|------------------------------|
| Bereich 3                    |
|------------------------------|
```

* Bereich 1 scrollt ganz langsamen und bezeichnet Objekte, die weit weg sind, z.B. Horizont oder sowas
* Bereich 2 ist meistens der Bereich in dem der Spieler unterwegs ist. Hier wird normales Scrolling verwendet, der Spieler sieht also einen Auschnitt einer Map oder so
* Bereich 3 wird schnell gescrollt. Hier werden ganz nahe Objekte dargestellt.

* 1 und 3 laufen in eigenen Threads und man kann ganz einfach entsprechende Bilder durchschieben


----------



## Kenan89 (20. Mai 2012)

es läuft allerdings so:
es wird intern mitte des anzeigebildschirm errechnet.
übersteigt held die mitte, so geht er rechts.
entfernt er sich von der mitte dann links.
die differenz zur mitte kann ich ja ermitteln. 
x-Koordinaten aller Objekte werden dann um diese differenz korrigiert.
auch die x-y Koordinaten der Spielkarte wird dann entsprechend verschoben.

So ist es möglich dass der Anzeigebildschirm nur 800*600 ist, die Spielmap aber 
1600*1500. 

Zu beachten ist allerdings, dass der Held eine globale UND lokale Position hat.

Lokal, die Position im Anzeigebildschirm.(800*600)
Global, die Position auf der Karte.(1600*1500)

Diese Werte sind später für die Kollisionsberechnung wichtig, denn
da muss mit globalen XY Koordinaten gerechnet werden.

Sollte es einen besseren Ansatz geben, nur zu.


----------



## Fu3L (21. Mai 2012)

Keine schlechte Überlegung, aber ParallaxScrolling ist das nicht.

Betrachte dieses Video:
SuperTux M2 - Resolution Independent Parallax Scrolling - YouTube
Du wirst erkennen können, dass es im Vordergrund große Platformen gibt, die sich schneller bewegen, als die auf der die Spielfigur läuft. Dahinter sind welche die sich noch langsamer bewegen.


----------



## Kenan89 (21. Mai 2012)

Ich denke, das ist auch die gängige Methode in der 2D-Spiele Industrie. Im Prinzip braucht man den Codeblock für das x-y-Scrollen der Spielkarte nur einmal schreiben und kann sie immer wieder verwenden.


----------



## Kenan89 (22. Mai 2012)

Jetzt klappt das alles soweit ganz gut.
Ein kleines Problem ist, da ich ja mit Slick arbeite, dass ich für x-y-Koordinaten float eingeben muss. 
Float enthält aber minimale Abweichungen, denn es ändert zum Teil sinnlos seinen Wert von 100 zu 99,99954 z.B.. Hindert das denn nicht für z.B. Kollisionsberechnungen, oder ist eine so minimale Abweichung nicht von Bedeutung?

Ich kann auch nicht auf integer zurückgreifen, weil die update methode alle 15 ms(oder?) aufgerufen wird
und eine bewegung ausführt, falls der Spieler eine Pfeiltaste gedrückt hat. Bei integer +1 alle 15 Sekunden wären das 67 px in eine Richtung pro Sekunde.
Mit float sind nur 7 px, da man hiermit Werte wie 0.1 eingeben kann.

EDIT:
Wie kann Slick eigentlich ein Bild zeichnen, wo der Abstand nicht 1 ist, also 1 px, sondern 0.1 ist.Der Computer kann doch nur pixelweise voran gehen, oder zählt er 10*0,1 und zeichnet dann das bild 1 px weiter?
Ausserdem, wenn ich das Game exportiere kann ich es nicht starten. Es passiert einfach gar nichts nach dem Doppelklick. Ich exportiere schon als Runnable Jar.


----------



## Kenan89 (22. Mai 2012)

Was mich auch interessieren würde, zu sehen, wie es erfahrenere Spieleprogrammierer machen. 
Kennt ihr einige Open Source Java 2D Spiele? Vorerst 2D. An 3D trau ich mich noch nicht.


----------



## Fu3L (22. Mai 2012)

Natürlich sagt die Grafikkarte: Das Objekt ist bei 0.5, also bei 1 (oder 0?) und fertig, das fällt niemandem auf. Im nächsten Schritt gehts vllt +0.5 auf 1 und dann ist auch das mit eingeflossen.

Bei Java2D Spielen kenn ich direkt keins, such einfach bei Google.


----------



## GeorgA (29. Mai 2012)

Hallo,
ob es immer noch Aktuell ist?
Gucke unter:

Paralax scrolling findest du im Kapitel 5

Gruß
Georg


----------

