243 lines
9.9 KiB
Text
243 lines
9.9 KiB
Text
= Programmieren lernen mit Singe
|
|
Scott Duensing <scott@kangaroopunch.com>
|
|
:revnumber: 3.00
|
|
:revdate: 2026
|
|
:doctype: book
|
|
:toc: left
|
|
:toclevels: 3
|
|
:title-logo-image: image:singeLogo.png[Singe, pdfwidth=2.6in, align=center]
|
|
:source-highlighter: rouge
|
|
:icons: font
|
|
:experimental:
|
|
:imagesdir: ../images
|
|
:lang: de
|
|
include::locale.adoc[]
|
|
|
|
[preface]
|
|
[#_before_you_begin]
|
|
== Bevor du anfängst
|
|
|
|
Dieses Buch bringt dir das Programmieren bei. Es geht davon aus, dass du in deinem Leben noch keine Zeile
|
|
Code geschrieben hast, und es geht nicht davon aus, dass du Programmierer werden willst --
|
|
nur, dass du ein Spiel machen willst.
|
|
|
|
Jede Lektion endet mit etwas, das du starten und mit dem du spielen kannst. Nichts wird
|
|
für später aufgehoben: Es gibt keine Theoriekapitel, bevor das erste Bild auf dem
|
|
Bildschirm erscheint. Dein erstes funktionierendes Programm schreibst du in etwa zehn Minuten, und es
|
|
wird fünf Zeilen lang sein.
|
|
|
|
Singe ist eine Spiel-Engine. Du kannst damit alles machen, was du mit
|
|
jeder anderen Engine machen kannst, in zwei Dimensionen oder in drei, und der größte Teil dieses Buchs handelt
|
|
genau davon. Was es abhebt, ist, dass es außerdem FMV-Video („Full Motion Video“)
|
|
als die Welt abspielen kann, in der das Spiel stattfindet; so funktionierten die Laserdisc-Spiele
|
|
der Spielhallen, und das kann fast nichts anderes gut. Das ist eine
|
|
Fähigkeit, keine Pflicht: Ein Spiel spielt nur dann Video ab, wenn es darum bittet, und
|
|
nichts, was du in den ersten dreizehn Lektionen schreibst, kommt auch nur in die Nähe davon.
|
|
|
|
Die Sprache ist Lua, die Singe für alles benutzt. Lua wurde von Leuten gewählt,
|
|
die sie Künstlern und Designern beibringen mussten, und das merkt man. Es gibt keine
|
|
Semikolons, die man vergessen kann, keine Typen, die man deklarieren muss, und keinen Compiler, mit dem man kämpfen muss. Wenn du
|
|
einen Fehler machst, sagt dir Singe die Datei, die Zeile und was es nicht
|
|
verstanden hat.
|
|
|
|
[#_what_you_need]
|
|
=== Was du brauchst
|
|
|
|
* *Singe.* Eine Datei. Leg sie in einen Ordner, den du wiederfindest.
|
|
* *Einen Texteditor.* Editor, TextEdit im Modus für reinen Text, Notepad++, VS Code
|
|
oder irgendetwas anderes, das reinen Text speichert. Eine Textverarbeitung geht nicht: Sie
|
|
speichert Formatierungen, die du nicht siehst, und Singe kann das nicht lesen.
|
|
* *Sonst nichts.* Du brauchst keine Laserdisc, keine Videodatei, kein Zeichenprogramm
|
|
und keine Grafiken. Der ganze erste Teil zeichnet alles selbst, und
|
|
ab dem zweiten Teil kommen die Bilder, die Sounds, das Video und die Modelle, die du
|
|
brauchst, alle mit dem Buch oder mit der Engine. Was du brauchst, steht weiter
|
|
unten.
|
|
|
|
[#_how_to_read_this_book]
|
|
=== Wie du dieses Buch liest
|
|
|
|
Tipp den Code ab. Kopier ihn nicht und füg ihn nicht ein. Abtippen ist langsamer, und genau darum
|
|
geht es: Du wirst kleine Fehler machen, und indem du sie behebst, lernst du zu
|
|
lesen, was der Computer dir sagt. Jede Lektion hat einen Abschnitt *Probier es aus* mit
|
|
Änderungen, die du machen sollst, und die sind so wichtig wie die Lektion.
|
|
|
|
Wenn eine Lektion schiefgeht und du nicht siehst, warum, liegt das fertige Skript jeder
|
|
Lektion im Ordner `learn`, der mit diesem Buch kommt, benannt nach seiner
|
|
Lektion: `01-hello.singe` und so weiter. Lies es erst, nachdem du es selbst versucht hast.
|
|
|
|
[#_how_your_folders_are_laid_out]
|
|
=== Wie deine Ordner aufgebaut sind
|
|
|
|
Lektion eins richtet das ein, und jede spätere Lektion setzt es voraus, also lohnt es sich,
|
|
es jetzt einmal zu sehen.
|
|
|
|
Du hast einen *Arbeitsordner*, in dem deine Kopie von Singe liegt. Jede Lektion legt darin einen
|
|
neuen Ordner an, benannt nach dem Skript, das darin liegt.
|
|
|
|
[literal]
|
|
----
|
|
singe/ <- dein Arbeitsordner, mit Singe darin
|
|
Singe/ <- hier legt die Engine ihre eigenen Dateien ab
|
|
data/ <- und alles, was deine Spiele speichern
|
|
hello/
|
|
hello.singe
|
|
rocks/
|
|
rocks.singe
|
|
art/
|
|
----
|
|
|
|
Du startest eine Lektion aus dem Arbeitsordner, indem du ihren Ordner nennst, also startet `Singe rocks`
|
|
die Datei `rocks/rocks.singe`. Diese Kurzform funktioniert, weil Ordner und
|
|
Skript denselben Namen haben. Das ist dieselbe Form, die ein echtes installiertes Spiel hat, und
|
|
darum benutzt das Buch sie ab der ersten Lektion, statt später aufzuräumen.
|
|
|
|
[#_what_comes_with_this_book]
|
|
=== Was zu diesem Buch gehört
|
|
|
|
Ab dem zweiten Teil benutzen die Lektionen Bilder und Sounds. Sie liegen im
|
|
Ordner `art`, der mit dem Buch kommt, und du kopierst diesen Ordner in den
|
|
Lektionsordner, in dem du gerade arbeitest, und behältst den Namen bei. Es gibt ein Raumschiff, einen Felsen, einen
|
|
Schuss, einen Stern, vier Frames von jemandem, der läuft, und zwei Geräusche.
|
|
`art/README.txt` listet sie mit ihren Größen auf.
|
|
|
|
Den Rest liefert Singe selbst. Wenn du zum ersten Mal irgendetwas startest, entpackt die Engine
|
|
einen Ordner namens `Singe` in deinen Arbeitsordner, und darin sind ein Video, eine
|
|
Schriftart, zwei 3D-Modelle und ein Klick. Die Lektionen, die diese brauchen, benutzen die,
|
|
die schon auf deiner Festplatte liegen, also musst du nichts suchen und nichts kaufen. Nichts davon
|
|
ist hübsch. Alles davon ist echt, und etwas Besseres einzusetzen ist meist nur
|
|
ein geänderter Dateiname.
|
|
|
|
[#_this_is_not_the_forge_book]
|
|
=== Dies ist nicht das Forge-Buch
|
|
|
|
Forge, ein eigenes Werkzeug mit einem eigenen Buch, macht ein Spiel, indem man es beschreibt,
|
|
statt es zu programmieren. Das ist ein anderer Weg an einen anderen Ort, für
|
|
jemanden, der überhaupt keinen Code schreiben will. Wenn du hierhergekommen bist, um programmieren zu lernen,
|
|
bist du hier richtig. Du brauchst weder Forge noch sein Buch, und
|
|
dieses Buch baut nicht darauf auf.
|
|
|
|
Die _Singe-Referenz_ ist das Nachschlagewerk: jede Funktion, jedes Argument, jeder
|
|
Rückgabewert und das Programmiermodell dahinter. Sie ist kein Tutorial und
|
|
versucht nicht, eines zu sein. Ungefähr ab Lektion sechs wirst du anfangen, zu ihr zu greifen, und
|
|
am Ende dieses Buchs wirst du sie mehr benutzen als dieses Buch. Sie kommt
|
|
im selben Download wie dieses hier.
|
|
|
|
[#_the_series]
|
|
== Die Reihe
|
|
|
|
Einunddreißig Lektionen in vier Teilen. Jede braucht die vorige und sonst
|
|
nichts.
|
|
|
|
*Teil eins: Die Ideen.* Keine Grafiken, kein Video, nichts zu installieren. Du zeichnest mit
|
|
den Formen und dem Text, die die Engine schon hat, und lernst, woraus ein Programm
|
|
besteht.
|
|
|
|
. *Hallo* -- ein Skript, eine Funktion, ein String und etwas auf dem Bildschirm.
|
|
. *Zahlen, die sich ändern* -- Variablen, Rechnen und Bewegung hineinbringen.
|
|
. *Entscheidungen treffen* -- `if`, Vergleiche und die Steuerung abfragen.
|
|
. *Noch einmal* -- `for` und `while`, und hundert Stück von etwas zeichnen.
|
|
. *Deine eigenen Funktionen* -- Argumente, Rückgabewerte und warum du dir die Mühe machen solltest.
|
|
. *Listen von Dingen* -- Tabellen, `ipairs`, Hinzufügen und Entfernen.
|
|
. *Ein Spiel* -- alles bisher, spielbar, in etwa hundertzwanzig Zeilen.
|
|
. *Wenn etwas schiefgeht* -- Fehlermeldungen lesen, `debugPrint` und Neuladen mit F5.
|
|
|
|
*Teil zwei: Ein echtes Spiel.* Grafiken, Sound und die Form, die ein fertiges Spiel annimmt.
|
|
|
|
[start=9]
|
|
. *Bilder* -- Sprites, Laden, Zeichnen und Frames.
|
|
. *Sound* -- Effekte, Musik und wann man was lädt.
|
|
. *Dinge treffen* -- Kollision, das Spiele-Kit und Hitboxen.
|
|
. *Punkte, Leben und Game Over* -- Zustand, Speichern und Neustarten.
|
|
. *Ein Spielordner* -- `games.dat`, Grafiken für das Menü und Starten daraus.
|
|
|
|
*Teil drei: Video.* Film als die Welt des Spiels abspielen, und die Arcade-Konventionen,
|
|
die darum herum entstanden sind. Überspring diesen Teil, wenn dein Spiel kein
|
|
Video will; nichts danach hängt von diesem Teil ab.
|
|
|
|
[start=14]
|
|
. *Video abspielen* -- die Disc, Frames, Springen und Warten.
|
|
. *Die andere Schreibweise* -- das Thread-Modell und warum es zu Video passt.
|
|
. *Verzweigungen* -- Entscheidungen, Pfade und die Form eines verzweigten Videospiels.
|
|
. *Lightguns* -- Zielen, Schießen und die Kalibrierung, die ein Automat braucht.
|
|
. *Quick-Time-Events* -- Aufforderungen, Zeitfenster und die Reaktionszeit des Spielers bewerten.
|
|
|
|
*Teil vier: Alles andere.* Jede Lektion steht für sich; nimm sie in beliebiger
|
|
Reihenfolge.
|
|
|
|
[start=19]
|
|
. *Text, der gut aussieht* -- Schriftarten, Qualität und Ausmessen.
|
|
. *Menüs und Bildschirme* -- die GUI, Dokumente und Gestaltung.
|
|
. *Untertitel* -- und warum sie ein eigenes System sind.
|
|
. *Hinein in 3D* -- Szenen, Kameras und Koordinaten.
|
|
. *Modelle und Licht* -- glTF, Materialien und Animation.
|
|
. *Physik* -- Körper, Kräfte, Gelenke und wann man sie nicht benutzt.
|
|
. *Partikel* -- Emitter und eine Explosion bauen.
|
|
. *Figuren, die sich selbst bewegen* -- Navigation und Wegfindung.
|
|
. *Musik und MIDI* -- Spuren, SoundFonts und Instrumente.
|
|
. *Online* -- Konten, Highscore-Tabellen und der Katalog.
|
|
. *Daten aufbewahren* -- Datenbanken, Tabellen und die Fragen, die du ihnen stellst.
|
|
. *Ausliefern* -- Packen, Patchen, Lizenzen und die Veröffentlichung.
|
|
. *Im Automaten* -- Steuerung, Service-Menüs, Bezels und die Dinge, die nur
|
|
auf echter Hardware zählen.
|
|
|
|
include::lessons/01-hello.adoc[]
|
|
|
|
include::lessons/02-numbers.adoc[]
|
|
|
|
include::lessons/03-decisions.adoc[]
|
|
|
|
include::lessons/04-repeating.adoc[]
|
|
|
|
include::lessons/05-functions.adoc[]
|
|
|
|
include::lessons/06-tables.adoc[]
|
|
|
|
include::lessons/07-a-game.adoc[]
|
|
|
|
include::lessons/08-when-it-goes-wrong.adoc[]
|
|
|
|
include::lessons/09-pictures.adoc[]
|
|
|
|
include::lessons/10-sound.adoc[]
|
|
|
|
include::lessons/11-hitting-things.adoc[]
|
|
|
|
include::lessons/12-score.adoc[]
|
|
|
|
include::lessons/13-game-folder.adoc[]
|
|
|
|
include::lessons/14-video.adoc[]
|
|
|
|
include::lessons/15-threaded.adoc[]
|
|
|
|
include::lessons/16-branching.adoc[]
|
|
|
|
include::lessons/17-light-guns.adoc[]
|
|
|
|
include::lessons/18-qte.adoc[]
|
|
|
|
include::lessons/19-text.adoc[]
|
|
|
|
include::lessons/20-gui.adoc[]
|
|
|
|
include::lessons/21-subtitles.adoc[]
|
|
|
|
include::lessons/22-3d.adoc[]
|
|
|
|
include::lessons/23-models.adoc[]
|
|
|
|
include::lessons/24-physics.adoc[]
|
|
|
|
include::lessons/25-particles.adoc[]
|
|
|
|
include::lessons/26-navigation.adoc[]
|
|
|
|
include::lessons/27-midi.adoc[]
|
|
|
|
include::lessons/28-online.adoc[]
|
|
|
|
include::lessons/29-databases.adoc[]
|
|
|
|
include::lessons/30-shipping.adoc[]
|
|
|
|
include::lessons/31-cabinet.adoc[]
|