= Programmieren lernen mit Singe Scott Duensing :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[]