axelerator.de

Episode 12 & 13: Ausblenden und Aufräumen

3 Minuten
#elm
16 October 2021

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.