Lunar Lander in C++
Der große Abschluss der Lehrveranstaltung Physik war die Implementierung von Lunar Lander in C++. In diesem einfachen Spiel geht es darum, eine Raumfähre auf dem Mond zu landen.Dabei spielt zum einen die Anziehungskraft des Erdtrabanten eine Rolle und zum anderen der verfügbare Tank der Raumfähre. Passend zur Landung der chinesischen Sonde auf der Erdabgewandten Seite vom Mond könnt ihr das schwierige Landemanöver ebenfalls versuchen. Nur mit gutem Timing schafft man die Landung.
Lunar Lander in C++
Beim Lunar Lander steuert man die Landefähre der Apollo Mission und muss am Mond sicher aufsetzen. Dazu gibt es eine Anzeige mit den Werten:
- vergangene Zeit
- verbleibender Tank
- aktuelle Geschwindigkeit
Ziel ist es nun mit der Schubdüse die Fähre auf eine Geschwindigkeit unter 5 m/s abzubremsen, damit diese sicher Aufsetzt. Dazu muss man aber geschickt den restlichen Tank im Auge behalten, ist dieser aus beschleunigt der Lander und trifft ungebremst auf den Boden vom Mond.
Implementierung
Auch dieses Beispiel ist mit er ClanLib Engine umgesetzt worden und der Source Code ist auf meiner GitHub Seite frei zur Verfügung. Es gibt 2 Klassen die Objekte der Szene repräsentieren:
- BgObject
wird benötigt um Objekte zu zeichnen. Von BgObject (Background Object) gibt es in der App Klasse 3 Instanzen für die Erde, den Mond und für die Sterne. Neben dem festlegen einer Bilddatei die gezeichnet werden soll gibt es auch noch zwei render Methoden. Eine mit und eine ohne Parameter. Über den optionalen Parameter kann das Bild skaliert werden. - Lander
der Lander ist von Particle abgeleitet und somit ein Objekt, auf das Kräfte angewendet werden können. Siehe dazu mein Feuerwerk Artikel in dem ich eine einfache Physikengine für ein Partikelsystem erstelle.
Physik
Auf den Lander wirkt konstant die Anziehungskraft des Mondes, weshalb er langsam Richtung Boden beschleunigt. Dazu ist in der globals.h die Anziehungskraft definiert:
#define GRAVITY_MOON 1.62 // gravitation of moon (m/s)
dem Gegenüber ist die Schubdüse, welche durch die Leertaste mit der konstanten Kraft der Anziehung entgegenwirkt:
#define SPEED_ENGINE 4.0 // thrust of the nozzle (m/s)
die restlichen Parameter definieren den maximalen Tank, den Spritverbrauch und die maximale Geschwindigkeit die für die Landung tolerierbar ist:
#define MAX_IMPACT_SPEED 5.0 // max 5 m/s otherwise crash #define MAX_FUEL 99.0 // full tank #define FUEL_CONSUMPTION 5.0 // consumption factor
Steuerung
Anders als bei allen bisherigen Beispielen wurde ein zweiter Tastatur Input Handler registriert. Es gibt nun zwei separate Methoden für das Drücken und Loslassen einer Taste. Die eine schaltet die Schubdüse an, die andere aus:
void App::on_keyboard_down(const clan::InputEvent &key) { switch (key.id) { case clan::keycode_space: lander._engine = true; if (lander._fuel > 0.0 && lander.registered == false) { lander.registered = true; Phys_engine.registerClass(&lander); } break; } } // on_keyDown void App::on_keyboard_up(const clan::InputEvent &key) { switch (key.id) { case clan::keycode_q: quit = true; break; case clan::keycode_space: lander._engine = false; Phys_engine.deregisterClass(&lander); lander.registered = false; break; } } // on_keyUp
In der App::render Methode sieht man die restliche Logik für die Anzeige der Texte und Änderung der Grafiken.
Geschichte
Lunar Lander ist ein Spiel mit viel Geschichte. Es wurde wohl schon auf fast allen Plattformen implementiert und geht auf das Jahr 1969 zurück in dem es noch in einem Textmodus auf einem Rechner lief. Die erste grafische Ausgabe gab es dann 1973 mit dem Spiel Moonlander. Ab 1979 konnte Lunar Lander auf Arcade Automaten der Firma Atari in Spielhallen gespielt werden.
Fazit
Lunar Lander ist eines der einfachsten Spiele die man mit Physik umsetzen kann. Nur dank dem Einsatz von Physik macht es nicht nur Spaß, es ist auch fordernd. Dank dem knappen Treibstoff ist das Timing sehr wichtig. Zündet man zu früh geht der Treibstoff aus, zündet man zu spät bremst man die Raumfähre nicht genug ab.
Wie lang braucht ihr bis zur Landung und wie viel Treibstoff bleibt im Tank?