-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial LunarLander_de
Select your language / Choisissez votre langue / Wählen Sie Ihre Sprache:
English | Français | Deutsch | Italiano | Español | Português | Slovenščina | Українська | Русский
In diesem Tutorial erstellen Sie ein Mondlandungs-Spiel - ein klassisches Arcade-Spiel, in dem Sie ein Raumschiff steuern, das auf eine Landeplattform herabsinkt. Sie müssen Ihren Schub so steuern, dass er der Schwerkraft entgegenwirkt, und sanft landen, ohne zu zerschellen. Dieses Spiel ist perfekt, um physikalische Konzepte wie Schwerkraft, Schub, Geschwindigkeit und Treibstoffverwaltung zu lernen.
Was Sie lernen werden:
- Schwerkraft- und Schubphysik
- Geschwindigkeitsbasierte Landeerkennung
- Treibstoffverwaltungssystem
- Rotations- oder Richtungssteuerung
- Sichere Landezonen
Schwierigkeit: Anfänger Preset: Fortgeschrittenen-Preset (die Schub-/Treibstoffphysik verlässt sich durchgehend auf Execute Code, das nicht im Anfänger-Preset ist)
- Die Landefähre wird von der Schwerkraft nach unten gezogen
- Drücken von HOCH wendet Schub nach oben an (verbraucht Treibstoff)
- LINKS/RECHTS steuern die Rotation oder Bewegung der Landefähre
- Landen Sie sanft auf der Landeplattform, um zu gewinnen
- Absturz, wenn Sie zu schnell landen oder die Plattform verfehlen
- Geht der Treibstoff aus, können Sie nicht mehr abbremsen!
| Element | Zweck |
|---|---|
| Landefähre | Das Raumschiff, das Sie steuern |
| Landeplattform | Sichere Zone zum Landen |
| Boden | Gelände, das einen Absturz verursacht |
| Treibstoffanzeige | Zeigt den verbleibenden Treibstoff |
| Geschwindigkeitsanzeige | Zeigt die aktuelle Geschwindigkeit |
- Klicken Sie im Ressourcen-Baum mit der rechten Maustaste auf Sprites und wählen Sie Sprite erstellen
- Nennen Sie es
spr_lander - Klicken Sie auf Sprite bearbeiten, um den Editor zu öffnen
- Zeichnen Sie ein einfaches Raumschiff (Dreieck oder klassische Landefähren-Form)
- Größe: 32x32 Pixel
- Wichtig: Setzen Sie den Ursprung auf Mitte-unten für eine korrekte Landung
- Erstellen Sie ein neues Sprite namens
spr_pad - Zeichnen Sie eine flache Plattform mit Markierungen (wie ein „H")
- Verwenden Sie helle Farben (Gelb/Grün)
- Größe: 64x16 Pixel
- Erstellen Sie ein neues Sprite namens
spr_ground - Zeichnen Sie felsiges/raues Gelände
- Verwenden Sie graue/braune Farben
- Größe: 32x32 Pixel
- Erstellen Sie ein neues Sprite namens
spr_flame - Zeichnen Sie eine kleine Flamme/einen Abgasstrahl
- Verwenden Sie orange/gelbe Farben
- Größe: 16x16 Pixel
![]()
Der Boden ist gefährliches Gelände, das einen Absturz verursacht.
- Klicken Sie mit der rechten Maustaste auf Objekte und wählen Sie Objekt erstellen
- Nennen Sie es
obj_ground - Setzen Sie das Sprite auf
spr_ground - Aktivieren Sie das Kontrollkästchen "Solid"
- Keine Events benötigt

Die Landeplattform ist der Ort, an dem der Spieler sicher landen muss.
- Erstellen Sie ein neues Objekt namens
obj_pad - Setzen Sie das Sprite auf
spr_pad - Aktivieren Sie das Kontrollkästchen "Solid"
- Keine Events benötigt (die Kollision wird von der Landefähre behandelt)

Die Landefähre ist das wichtigste vom Spieler gesteuerte Objekt mit
Physik. Anders als bei den anderen Bewegungs-Tutorials dieses Wikis müssen
ihre Steuerungen Geschwindigkeit allmählich aufbauen und eine
Treibstoffressource verfolgen, daher stützt sich dieses Objekt stärker auf
Control → Execute Code (echtes Python — self ist die aktuelle
Instanz, game ist der Game Runner, keyboard.check(name) meldet eine
gehaltene Taste) als allein auf strukturierte Aktionen. Überall, wo eine
strukturierte Aktion die Arbeit erledigt, verwendet dieses Tutorial
weiterhin eine.
- Erstellen Sie ein neues Objekt namens
obj_lander - Setzen Sie das Sprite auf
spr_lander
Event: Create
- Aktion hinzufügen: Move → Set Gravity (Direction:
270, Gravity:0.05) — ein sanfter Zug nach unten; die Engine addiert dies bei jedem Schritt automatisch zur Vertikalgeschwindigkeit der Landefähre, genau wie die Schwerkraft des Plattformer-Tutorials, nur schwächer. - Aktion hinzufügen: Control → Execute Code:
self.thrust_force = 0.1
self.max_speed = 5
self.fuel = 100
self.fuel_use = 0.5
self.landed = False
self.crashed = False
self.safe_speed = 2Das Bewegungssystem dieses Projekts verfolgt die Geschwindigkeit bereits
über self.hspeed/self.vspeed und bewegt die Instanz bei jedem Frame um
diesen Betrag (mit eingebauter solider Kollision) — es sind keine
separaten hsp/vsp-Variablen nötig, wie sie eine rohe
Physiksimulation verfolgen würde.
Event: Step — Aktion hinzufügen: Control → Execute Code:
if not self.landed and not self.crashed:
if keyboard.check('up') and self.fuel > 0:
self.vspeed -= self.thrust_force
self.fuel -= self.fuel_use
if self.fuel < 0:
self.fuel = 0
if keyboard.check('left'):
self.hspeed -= 0.05
if keyboard.check('right'):
self.hspeed += 0.05
# Höchstgeschwindigkeit begrenzen
self.hspeed = max(-self.max_speed, min(self.max_speed, self.hspeed))
self.vspeed = max(-self.max_speed, min(self.max_speed, self.vspeed))
# Verhindert, dass die Landefähre über die Seiten oder über den Raum hinaus driftet
room = game.current_room
if self.x < 16:
self.x = 16
self.hspeed = 0
if self.x > room.width - 16:
self.x = room.width - 16
self.hspeed = 0
if self.y < 16:
self.y = 16
self.vspeed = 0Der gesamte Block ist in if not self.landed and not self.crashed:
gehüllt, damit Schub und Steuerung sofort stoppen, wenn das Spiel endet —
das self-Objekt hat keine Möglichkeit, ein Event mittendrin abzubrechen
(kein exit im GML-Stil), also ist ein if um den restlichen Code das
Äquivalent.
Event: Collision with obj_pad
- Aktion hinzufügen: Control → Test Expression
- Expression:
(self.hspeed**2 + self.vspeed**2)**0.5 <= self.safe_speed— die Landegeschwindigkeit ist die Länge des Geschwindigkeitsvektors; Pythagoras, keinespeed-Variable (in dieser Engine istspeeddie Sprite-Animations-Rate, nicht der Bewegungsbetrag — eine echte Falle für alle, die von GameMaker kommen). - Then Actions:
-
Control → Set Variable (Variable:
landed, Value:true, Scope:self) - Move → Stop Movement
-
Move → Set Gravity (Direction:
270, Gravity:0) — hält die Schwerkraft davon ab, bei einer bereits gelandeten Landefähre wieder unbemerkt Vertikalgeschwindigkeit aufzubauen -
Output → Show Message (Message:
Perfect Landing! You Win!)
-
Control → Set Variable (Variable:
- Else Actions:
-
Control → Set Variable (Variable:
crashed, Value:true, Scope:self) -
Output → Show Message (Message:
Crashed! Too fast!) - Room → Restart Room
-
Control → Set Variable (Variable:
- Expression:
Der Text von Show Message ist eine feste Zeichenkette — er kann die tatsächliche Landegeschwindigkeit nicht einbetten. Das HUD (Schritt 7) zeigt die Live-Geschwindigkeit bis zum Moment des Aufsetzens, der Spieler hat die Zahl also bereits gesehen.
Event: Collision with obj_ground
- Aktion hinzufügen: Control → Set Variable (Variable:
crashed, Value:true, Scope:self) - Aktion hinzufügen: Output → Show Message (Message:
Crashed into terrain!) - Aktion hinzufügen: Room → Restart Room

Visuelles Feedback beim Schub.
- Erstellen Sie ein neues Objekt namens
obj_flame - Setzen Sie das Sprite auf
spr_flame
Es wird von der Landefähre beim Schub erzeugt (fortgeschrittene Funktion). Für einen einfacheren Ansatz können Sie die Flamme im Draw-Event der Landefähre zeichnen.

Der Spiel-Controller zeigt Treibstoff, Geschwindigkeit und Anweisungen an, indem er sie bei jedem Frame von der Landefähren-Instanz abliest.
- Erstellen Sie ein neues Objekt namens
obj_game_controller - Kein Sprite nötig
Event: Draw
- Aktion hinzufügen: Control → Execute Code — findet die Landefähre und berechnet die Werte, die die Draw-Aktionen unten anzeigen:
lander = None
for inst in game.current_room.instances:
if inst.object_name == 'obj_lander':
lander = inst
break
if lander is not None:
self.fuel_display = round(lander.fuel)
self.speed_display = round((lander.hspeed ** 2 + lander.vspeed ** 2) ** 0.5, 2)
self.too_fast = self.speed_display > lander.safe_speed
self.no_fuel = lander.fuel <= 0
else:
self.fuel_display = 0
self.speed_display = 0.0
self.too_fast = False
self.no_fuel = False- Aktion hinzufügen: Game → Set Draw Color (Color:
#FFFFFF) - Aktion hinzufügen: Game → Draw Text (Text:
LUNAR LANDER, X:10, Y:10) - Aktion hinzufügen: Game → Draw Text (Text:
Fuel:, X:10, Y:30) - Aktion hinzufügen: Game → Draw Variable (Variable:
self.fuel_display, X:70, Y:30) - Aktion hinzufügen: Game → Draw Text (Text:
Speed:, X:10, Y:50) - Aktion hinzufügen: Game → Draw Variable (Variable:
self.speed_display, X:70, Y:50) - Aktion hinzufügen: Game → Draw Text (Text:
Safe Speed: < 2, X:10, Y:70)
Dann die zwei Warnzeilen, jede über Control → Test Expression gesteuert (kein Else nötig — es wird nichts gezeichnet, wenn die Bedingung falsch ist):
-
Control → Test Expression (Expression:
self.too_fast)- Then Actions: Game → Set Draw Color (
#FF0000), Game → Draw Text (TOO FAST!, X10, Y90) - Else Actions: Game → Set Draw Color (
#00FF00), Game → Draw Text (Speed OK, X10, Y90)
- Then Actions: Game → Set Draw Color (
-
Control → Test Expression (Expression:
self.no_fuel)- Then Actions: Game → Set Draw Color (
#FF0000), Game → Draw Text (NO FUEL!, X10, Y110)
- Then Actions: Game → Set Draw Color (
-
Aktion hinzufügen: Game → Set Draw Color (Color:
#808080) -
Aktion hinzufügen: Game → Draw Text (Text:
UP: Thrust | LEFT/RIGHT: Move, X:10, Y:440) — wählen Sie ein Y nahe dem unteren Rand der Raumgröße, die Sie in Schritt 8 verwenden.

- Klicken Sie mit der rechten Maustaste auf Rooms und wählen Sie Room erstellen
- Nennen Sie ihn
room_game - Legen Sie die Raumgröße fest (z. B. 640x480)
- Setzen Sie die Hintergrundfarbe auf Schwarz (Weltraum)
Bauen Sie Ihr Level nach diesen Richtlinien:
-
Boden - Platzieren Sie
obj_groundentlang des unteren Rands, um Gelände zu schaffen -
Landeplattform - Platzieren Sie
obj_padin einer Lücke im Gelände -
Landefähre - Platzieren Sie
obj_landeroben im Raum -
Spiel-Controller - Platzieren Sie
obj_game_controllerirgendwo
L <- Die Landefähre startet hier
GGG GGG PPPP GGG GGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
G = Boden L = Landefähre P = Landeplattform

- Klicken Sie auf Ausführen oder drücken Sie F5 zum Testen
- Verwenden Sie die Pfeiltaste HOCH für Schub (achten Sie auf Ihren Treibstoff!)
- Verwenden Sie die Pfeiltasten LINKS/RECHTS zum Steuern
- Landen Sie sanft auf der Plattform (Geschwindigkeit muss unter 2 sein)
- Weichen Sie dem felsigen Gelände aus!
Statt Links/Rechts-Bewegung: drehen Sie die Landefähre und geben Sie Schub
in die Richtung, in die sie zeigt. Die Instanzen dieser Engine haben ein
echtes rotation-Attribut (Grad, 0 = rechts, gegen den Uhrzeigersinn
zunehmend), mit dem das Sprite gedreht wird — kein
image_angle/lengthdir_x/lengthdir_y nötig, da math in Execute Code
bereits verfügbar ist:
Ersetzen Sie den Create-Event-Code aus 5.1 durch:
self.thrust_force = 0.1
self.max_speed = 5
self.fuel = 100
self.fuel_use = 0.5
self.landed = False
self.crashed = False
self.safe_speed = 2
self.rotation = 90 # nach oben zeigend
self.rotation_speed = 3Ersetzen Sie die Steuerungszeilen aus 5.2 (den left/right →
hspeed-Block) durch:
if keyboard.check('left'):
self.rotation -= self.rotation_speed
if keyboard.check('right'):
self.rotation += self.rotation_speedUnd ersetzen Sie die Schubzeilen durch:
if keyboard.check('up') and self.fuel > 0:
rad = math.radians(self.rotation)
self.hspeed += self.thrust_force * math.cos(rad)
self.vspeed -= self.thrust_force * math.sin(rad)
self.fuel -= self.fuel_use
if self.fuel < 0:
self.fuel = 0(das -= bei vspeed entspricht dem Schwerkraftcode der Engine — die
Bildschirm-Y-Achse nimmt nach unten zu, „oben" ist also negative
Vertikalgeschwindigkeit).
Erstellen Sie Plattformen unterschiedlicher Größe mit unterschiedlichen Punktwerten:
- Kleine Plattform = 100 Punkte (schwerer)
- Große Plattform = 50 Punkte (einfacher)
- Erstellen Sie
obj_fuel, das in der Luft schwebt - Bei Kollision mit der Landefähre: Treibstoff hinzufügen und zerstören
Erstellen Sie mehrere Räume mit zunehmend schwierigerem Gelände und kleineren Landeplattformen.
Fügen Sie einen kleinen konstanten horizontalen Schub hinzu. Im
Create-Event-Code von obj_lander fügen Sie self.wind_force = 0.02
hinzu; dann am Anfang des if not self.landed and not self.crashed:-Blocks
des Step-Events:
self.hspeed += self.wind_force| Problem | Lösung |
|---|---|
| Die Landefähre fällt zu schnell | Verringern Sie den Gravity-Wert von Set Gravity, oder erhöhen Sie thrust_force im Create-Event-Code |
| Kann nicht genug abbremsen | Erhöhen Sie thrust_force, oder erhöhen Sie safe_speed
|
| Der Treibstoff geht zu schnell aus | Verringern Sie fuel_use, oder erhöhen Sie den Start-fuel
|
| Die Landefähre verlässt den Bildschirm | Prüfen Sie den Grenzblock am Ende des Step-Event-Codes |
| Die Landung wird nicht erkannt | Stellen Sie sicher, dass obj_pad "Solid" aktiviert hat |
Herzlichen Glückwunsch! Sie haben ein Mondlandungs-Spiel erstellt! Sie haben gelernt:
-
Schubphysik -
self.vspeedgegen einen kontinuierlichen Set-Gravity-Zug anstupsen -
Geschwindigkeitsverwaltung - Geschwindigkeit aus
hspeed/vspeedmit dem Satz des Pythagoras berechnen - Treibstoffsystem - Ressourcenverwaltungs-Gameplay mit einer einfachen Instanzvariablen
- Kollisionserkennung - Unterschiedliche Ergebnisse für Plattform vs. Boden, gewählt mit Test Expression
- HUD-Anzeige - Anzeigewerte in Execute Code berechnen und dann mit Draw Text/Draw Variable anzeigen
- Realistische Rotation - In Blickrichtung drehen und Schub geben
- Mehrere Level - Zunehmend schwieriges Gelände
- Punktesystem - Punkte je nach verbleibendem Treibstoff und Landegenauigkeit
- Asteroiden - Bewegliche Gefahren zum Ausweichen hinzufügen
- Zwei-Spieler-Modus - Wettlauf, wer zuerst landet
- Tutorials - Mehr Spiel-Tutorials
- Fortgeschrittenen-Preset - Überblick über das Preset, das dieses Tutorial braucht
- Tutorial: Plattformer - Ein Plattform-Sprungspiel erstellen
- Tutorial: Labyrinth - Ein Labyrinth-Navigationsspiel erstellen
- Event-Referenz - Vollständige Event-Dokumentation