Spieleprogrammierung mit Scratch

Thema dieser Hacker-School ist die Erstellung eines einfachen Geschicklichkeitsspiels, bei dem der Spieler verschiedenen Hindernissen oder Gegnern ausweichen muss um möglichst viele Münzen, Sterne, Ostereier oder was auch immer zu sammeln. Ihr werdet sehen auf wie viele Arten und Weisen man dieses einfache Thema variieren kann und an welchen Stellschrauben man drehen muss, damit das Spiel auch Spaß macht.

Schritt für Schritt zum Spiel

  1. Die Hauptfigur

    Wir schauen uns an wie man eine Figur in Scratch anlegt und bewegen Sie über den Bildschirm. Für jedes Spiel das wir hier programmieren, wird es immer genau eine Hauptfigur geben, daher ist die Art auf die sie sich bewegt elementarer Bestandteil eures Spiels.

  2. Kollisionen mit anderen Figuren

    Wenn die Hauptfigur andere Figuren berührt soll darauf reagiert werden. Je nach Art der Figur möchte man möglicherweise Punkte vergeben, Texte anzeigen, das Spiel beenden ... Diese Art der Interaktion bestimmt euer Spielkonzept: Bei einem Rennspiel müssen bestimmte Figuren der Reihe nach "angefahren" werden, bei einem Labyrinthspiel vermieden werden ...

  3. Zufälliges erzeugen von Figuren

    Bisher ist unser Spiel noch ziemlich statisch, wir wollen jetzt an zufälligen Orten in der Spielwelt Figuren verteilen. Damit das nicht zu unübersichtlich wird, schauen wir uns an was Scratch unter dem Konzept von "Klonen" versteht.

  4. Spielen auf Zeit

    Zeitdruck ist eine der einfachsten Möglichkeiten, einem Spiel Wettbewerbscharakter zu verleihen. Und Wettbewerb ist eine typische Methode um ein kurzes Spiel interessant zu gestalten.

  5. Mehrere Bildschirme

    Euer Spiel sollte im Normalfall mindestens zwei Bildschirme haben: Einen für das eigentliche Spiel, einen für die Punkteanzeige. Wer mag kann aber auch einen "Ladebildschirm" dazupacken, auf dem das Spiel kurz erklärt wird.

Kurze Tipps

  1. Verschiedene Arten von Gegnern

    Bisher sind die Gegner recht langweilig immer am gleichen Ort geblieben. Wir möchten jetzt ein paar schlauere Gegner hinzufügen.

Beispielspiele

Sammle in der kurzen Zeit möglichst viele Früchte ein. Aber vorsicht, wer zu gierig ist und jeder neuen Frucht hinterherrennt, geht am Ende möglicherweise leer aus.

Fahre drei Runden über einen Kurs mit etwas merkwürdiger Spielphysik ... Beschleunige mit , lenke mit und .

Das Basisspiel

Die Bewegung der Hauptfigur

Wenn wir mit der Tastatur arbeiten, unterscheiden wir zwischen zwei verschiedenen Arten von Bewegung: Absolut und relativ.

Bei der absoluten Bewegung können wir nur zwischen den vier verschiedenen Richtungen der Pfeiltasten unterscheiden. Drückt der Spieler eine Taste, zeigt die Spielfigur sofort in die entsprechende Richtung.

Da wir mit exakt vier Richtungen arbeiten, ist es relativ einfach zwischen vier verschiedenen Kostümen für die jeweilige Richtung zu wechseln. Dadurch ist es möglich, eine Figur aus verschiedenen Perspektiven zu zeigen.

Bei der relativen Bewegung hängt die Veränderung der Bewegung von der Blickrichtung der Figur ab. Diese Art der Bewegung braucht nur zwei Tasten: Links und rechts.

Die Schrittweite mit der die Figur gedreht wird sollte die Zahl 360 ganzzahlig teilen. Verwendet man eine Schrittweite die 360 nicht ganzzahlig teilt, kann der Benutzer die Figur nicht exakt an den vier Himmelsrichtungen ausrichten.

Abhängig von der Schrittweite braucht diese Art der Bewegung möglicherweise zu viele verschiedene Kostüme, um jede Richtung sinnvoll darstellen zu können. Es empfiehlt sich daher nur ein einziges Kostüm zu verwenden, und es von Scratch drehen zu lassen.

Kollisionen mit Figuren

Nur zum Selbstzweck mit der Hauptfigur umherzulaufen ist nicht besonders spannend. In diesem Abschnitt sorgen wir für ein paar Interaktionen mit anderen Figuren.

Um den Spieler mit Punkten zu belohnen, müssen wir eine neue Variable für alle Figuren einfügen. Diese Variable wird zu Beginn des Spiels auf 0 gesetzt. Jedes mal wenn die Spielfigur eine andere Figur trifft, versteckt sich diese Figur und der Punktestand wird um einen Punkt erhöht.

Möchte man mit Leben arbeiten, ist das prinzipielle Vorgehen ähnlich. Es braucht eine neue Variable für alle Figuren, die sich im Falle einer Kollision mit der Hauptfigur verstecken soll. Im Unterschied zum vorigen Beispiel werden dann aber Leben abgezogen, nicht Punkte addiert.

Die Hauptfigur bewegt sich in diesem Beispiel nur noch, wenn die Anzahl der Leben größer ist als 0.

Zufälliges erzeugen von Figuren

Auch wenn man von Scratch dazu verleitet wird bestimmte Figuren einfach mitsamt Ihrem Quellcode zu kopieren, ist es meistens geschickter mit den Funktionen zum Klonen von Figuren zu arbeiten. Man sieht dann zwar im Editor nicht mehr, wo welche Figur auftauchen wird, kann den Spieler dann aber mit immer neuen Varianten überraschen.

Bei dieser Variante werden alle Figuren komplett zufällig erzeugt, was manchmal zu ärgerlichen Problemen führt:

  • Sie entstehen "in" der Hauptfigur und geben einen Punkt ohne das der Spieler dafür etwas tun musste.
  • Sie entstehen "ineinander".

Um die Probleme des vorigen Beispiels zu umgehen, verwendet dieses Beispiel vordefinierte Spawnpunkte, die an Orten liegen denen der Spieler zu Beginn nicht zu nahe kommen kann.

Spielen mit Zeit

Aktuell sind unsere Spiele keine sehr große Herausforderung. Wir fügen einen Zeitfaktor hinzu, um für ein bisschen Hektik zu Sorgen ...

Dieses Beispiel zeigt ein erstes Endlosspiel. Bisher haben wir einmal zu Beginn des Spiels Figuren erzeugt und sie erst wieder entfernt, sobald der Spieler sie berührt hat. Diese Variante erzeugt alle paar Sekunden eine neue Figur, die Ihrerseits aber wieder nach einigen Sekunden verschwindet.

Ganz endlos zu spielen ist dann vielleicht doch doof, wir wollen den Spieler nun auf die Jagd nach einem Highscore schicken. Dafür geben wir Ihm 30 Sekunden Zeit, in denen er so viele Punkte wie möglich erzielen soll.

Mehrere Bildschirme

Kurze Tipps

Dieses Beispiel simuliert relative Bewegung mit Beschleunigung und ist relativ komplex. Die größte Hürde sind dabei nicht die Formeln zur Beschleunigung, sondern der Umgang mit variabel großen Zeitschritten. Wir haben das Problem mit den Zeitschritten bisher dadurch umgangen, dass sich die Hauptfigur immer gleichmäßig bewegt hat und man für jede Drehung die entsprechende Taste erneut drücken musste.

Ihr könnt dieses Beispiel ohne größere Umstände in eure eigenen Projekte übernehmen. Ersetzt einfach die Bewegungssteuerung eurer Hauptfigur durch den Code dieser Hauptfigur und sorgt dafür, dass die Stoppuhr gestartet wird.

Für euer Projekt passende Werte für (Beschleunigung), (Lenkung) und (Bremsen) findet Ihr am besten durch Experimente mit diesem Beispiel heraus.

Neben Punkten könnte man den Spieler auch mit kleinen Powerups belohnen. Dieses Beispiel zeigt, wie man auf Knopfdruck einen kurzen Geschwindigkeitsboost auslöst und Powerups einsammelt.

Programmiertechnisch im Vordergrund steht das Senden und Empfangen von Nachrichten, um auf zwei Seiten auf Ereignisse zu reagieren. Der Powerupblock (in diesem Beispiel das Ei), sendet die Nachricht "Speed" an alle und löscht sich dann selbst. Die Hauptfigur wartet auf die Nachricht "Speed" und erhöht dann die Anzahl der verfügbaren Boosts die mit einem Druck auf Space eingesetzt werden können.