Informatik

Die Kamera

Bisher endet die Welt am Rand des Bildschirms. In agar.io ist das Spielfeld aber riesig, und man sieht immer nur den Ausschnitt um die eigene Zelle. Genau das macht eine Kamera: Sie legt fest, welcher Teil der Welt auf dem Bildschirm zu sehen ist.

Die Kamera folgt dem Spieler

Jede Bühne hat eine Kamera. In run() setzt die Welt sie bei jedem Bild auf die Position des Spielers:

kamera.setPosition(spieler.getPosition());

Damit steht der Spieler immer in der Mitte des Bildschirms, und die Welt scheint sich unter ihm zu bewegen. An den Koordinaten der Figuren ändert die Kamera nichts – sie bestimmt nur, was man sieht. Auch getMouse() liefert weiterhin eine Position in der Welt, deshalb muss der SpielerDonut nicht geändert werden.

Das Futter entsteht jetzt nicht mehr um den Nullpunkt, sondern um die Kamera herum – sonst würde es nach einer Weile hinter dem Spieler liegen. Und weil die Kamera beim Wachsen herauszoomt, wird auch der Bereich größer, in dem es entsteht: Die Zufallswerte werden mit faktor = 100 / kamera.getZoom() multipliziert. Bei 50 % Zoom sieht man doppelt so weit, der Faktor ist dann 2.

Rauszoomen beim Wachsen

Je größer der Donut, desto weiter zoomt die Kamera heraus. Der Zoom ist eine Prozentzahl: 100 ist die normale Größe, 50 zeigt alles halb so groß und damit doppelt so viel von der Welt. Die Welt rechnet bei jedem Bild aus, welcher Zoom zur Stärke passt, und nähert sich ihm in kleinen Schritten:

double zielZoom = 1000.0 / spieler.getStaerke();
if (kamera.getZoom() > zielZoom) {
   kamera.changeZoom(-0.1);
}

setZoomLimit(30, 200) im Konstruktor legt fest, dass nie weiter als auf 30 % herausgezoomt wird.

Ein gezeichnetes Gitter

Ohne Hintergrund sieht man nicht, dass sich der Spieler bewegt – die Bühne ist überall gleich hell. Deshalb zeichnet die Welt im Konstruktor einmal ein Gitter aus Linien im Abstand von 40 Pixeln, von −3000 bis 3000 in beide Richtungen, mit einem dicken roten Rand außen herum:

Gitter gitter = new Gitter(3000);
gitter.zeichneAuf(this);

Die Klasse Gitter legt dafür einen Pen an und zieht pro Schleifendurchlauf je eine senkrechte und eine waagerechte Linie.

Danach muss niemand mehr etwas mit dem Gitter tun. Was ein Stift zeichnet, liegt wie die Figuren in der Welt: Die Kamera verschiebt und zoomt es mit. Ein Bild, das man mit der Kamera mitschieben müsste, wäre aufwendiger und würde bei jedem Nachziehen kurz flackern.

a) Ändere den Abstand der Linien in Gitter auf 100 und auf 10.

b) Ändere die Grenze von 3000 auf 500. Fahre über den Rand hinaus. Was siehst du – und was nicht?

c) Wie viele Linien zeichnet das Gitter bei einer Grenze von 3000? Rechne es aus, bevor du nachzählst.

d) Ändere 1000.0 in der Formel für zielZoom. Was bewirken 500 und 2000?

Weiterspielen

Zoomen per Tastatur. Lass die Spielerin mit den Tasten 1 und 0 selbst herein- und herauszoomen und mit R auf 100 % zurückstellen. Solange sie selbst gezoomt hat, soll die Welt nicht mehr automatisch zoomen.

Weltgrenze. Der rote Rand ist nur gemalt – man kann einfach darüber hinausfahren. Sorge dafür, dass kein Donut die Welt verlassen kann.

Nach dem Bewegen prüfen, ob der Donut außerhalb liegt, und ihn dann auf den Rand zurücksetzen.

Die Kamera

Teilbare URL erstellen

Abschnitte auswählen