Alles bewegt sich
Das Ziel
Bugs bleibt stehen, die Welt zieht an ihm vorbei – und zwar endlos. Genau so machen es alle Jump-and-Run-Spiele.
So sieht das aus
Wie es gemacht ist
Jedes Sprite hat eine Methode run. Sie wird etwa 60-mal pro Sekunde
aufgerufen – einmal für jedes Bild. Was darin steht, passiert also ständig:
public void run() {
this.changeX(-spiel.getGeschwindigkeit());
if (this.getX() < -450) {
this.changeX(BunnyHop.PLATTFORMEN * BunnyHop.BREITE);
}
}
Zeile 1 schiebt die Plattform ein Stück nach links. Die if-Abfrage prüft, ob sie
links aus dem Bild gewandert ist, und schiebt sie dann um die ganze Weltbreite nach
rechts – dorthin, wo gerade Platz frei geworden ist.
Es entstehen keine neuen Plattformen. Es sind immer dieselben neun, sie werden nur immer wieder nach hinten gestellt. Das nennt man Recycling – es spart Speicher und ist der übliche Trick bei endlosen Spielwelten.
Die Plattform kennt das Spiel: Im Konstruktor bekommt sie es übergeben und merkt es
sich im Attribut spiel. So kann sie jederzeit spiel.getGeschwindigkeit() fragen.
Diese Verbindung zwischen zwei Klassen heißt Assoziation.
Deine Aufgabe
a) Starte das Programm. Zieht der Boden gleichmäßig vorbei, ohne Lücke?
b) Ändere die Geschwindigkeit auf 1 und auf 10. Was fällt dir bei 10 auf?
c) Ersetz in der if-Abfrage die −450 durch −400. Beobachte den linken Rand genau.
Was passiert und warum?
d) Lass die Welt rückwärts laufen.
Tipp 1: Warum −450 und nicht −400?
Der Bildrand liegt bei −400. Eine Plattform ist 100 Pixel breit, ihr Mittelpunkt also noch 50 Pixel im Bild, wenn ihre rechte Kante gerade verschwindet.
Erst bei −450 ist sie ganz draußen. Wer früher umsetzt, tut das vor den Augen der Spielerin.
Tipp 2: Rückwärts
changeX mit einer positiven Zahl schiebt nach rechts. Dann muss auch die
if-Abfrage auf die andere Seite schauen: if (this.getX() > 450).