Episode 12 & 13: Ausblenden und Aufräumen
In Episode 12(1h:25m) habe ich zunächst einen einfachen Zähler für die entfernten Reihen gebaut. Das graduelle Ausblenden ist zu einen Cliffhanger geworden, da ich dort einen Fehler eingebaut hab, den ich erst in Episode 13 (1h:20) auflöse. Das nehme ich zum Anlass den Code mit Hilfe des großartigen Conquer of Completion etwas aufzuräumen.
Für Episode 12 habe ich wie bisher einen einzelnen Commit erzeugt und einen Branch der den Code am Ende der Episode enthält.
Die Codeänderungen für Episode 13 habe ich etwas anders organisiert. Da ich den Code großzügig umorganisiert habe betreffen die Änderungen viele Zeilen.
Damit die Git Historie trotzdem übersichtlich bleibt habe ich mehrere kleine Commits erzeugt.
Es gibt natürlich trotzdem einen episode13
Branch der den Endzustand enthält. Die Entwicklung zwischen den Episoden 12 und 13 habe ich aber diesmal in einem Pull-Request zusammengefasst.
Inhalt:
Punktestand
Um sich vergleichen zu können habe ich dem Spiel einen Typen Score
für den Punktestand hinzugefügt.
Ich habe die einfachst mögliche Implementierung gewählt: 1 Zeile = 1 Punkt. Das echte Punktesystem von Tetris is um einiges komplizierter (Quelle: Tetris Wiki)
Level | Points for 1 line | 2 lines | 3 lines | 4 lines |
---|---|---|---|---|
0 | 40 | 100 | 300 | 1200 |
1 | 80 | 200 | 600 | 2400 |
2 | 120 | 300 | 900 | 3600 |
9 | 400 | 1000 | 3000 | 12000 |
level(n) = 40 * (n + 1) 100 * (n + 1) 300 * (n + 1) 1200 * (n + 1)
Ausblenden
Für das Ausblenden habe ich eine neue ‘Zeilenvariante’ hinzugefügt:
type Row
= Row (List Field)
| FadingRow (List Field) Opacity
Die FadingRow
stellt eine Zeile dar die logisch entfernt wurde aber visuell noch teilweise sichtbar ist.
Neben den einzelnen Spalten enthält sie auch einen Transparenzwert.
Um das Ausblenden in einer optisch ansprechenden Geschwindigkeit zu erreichen feuern wir jetzt unseren GravityTick
alle 30 anstatt 100 Millisekunden und erhöhen die Transparenz der ‘ausblendenden’ Reihen bei jedem Tick mit der progressFading
Funktion.
Bei dem Versuch progressFading
an all den richtigen Stellen aufzurufen habe ich dann auch den Fehler eingebaut. Als Teil von eraseCompleteRows
habe ich das aktuelle Teil zurückgesetzt.
Der erste Commit von Episode 13 behebt diesen Fehler und alles funktioniert wie erwartet.
Aufräumen
Den Rest dieser Episode verbringe ich damit die allgemeine Anwendungslogik von der ‘reinen’ Spiellogik zu trennen. Ich würde es allerdings noch nicht als eine Rafaktorisierung bezeichnen denn die Änderungen sind alle recht ‘mechanisch’. Damit meine ich, dass die Funktionen sich fast nicht geändert haben sondern lediglich den Ort gewechselt haben wo sie gespeichert sind.
Dabei habe ich mir ein neues Werkzeug in meiner Entwicklungsumgebung zu Nutze gemacht. Conquer of Completion kur CoC ist ein Vim Plugin, dass das Language Server Protocol nutzt um den Entwickler mit Sprachspezifischen Hinweisen zu unterstützen. Es ist das gleiche Protokoll das auch in VS Code für viele Sprachen verwendet wird um Autovervollständigung und andere Funktionen wie das Organisieren von Imports zu unterstützen.
Mit Hilfe des CoC lassen sich Operationen wie das Verschieben von Funktionen deutlich effizienter ausführen, da das Plugin lästige Tätigkeiten, wie das importieren von Modulen und entfernen von ungenutztem Code automatisiert.
Ein paar entscheidende Hinweise wie dieses Setup einzurichten ist habe ich in dem Projekt für den Elm Language Server gefunden.
Ich denke ich werde in naher Zukunft nochmal eine dedizierte Episode zur Einrichtung eine Elm Entwicklungsumgebung machen.