Freitag, 8. März 2013

Fehlersuche: Ein Wherigo-Projekt debuggen

Voraussetzungen: Zone als Kreis

Abbildung 1: Beim Erreichen der Zone wird eine Debug-Nachricht geschrieben und so der Stand der Variable Punkte kontrolliert.
Wer kennt es nicht, man hat stundenlang den schönsten Programmablauf und Variablen definiert, die ereignisabhänig manipuliert werden, aber beim Testlauf funktioniert es einfach nicht.
Manchmal kann man sich mit MessageBoxen behelfen. Aber das ist recht aufwändig und nicht immer einsetzbar, da MessageBoxen von nachfolgenden Events überlagert werden. Außerdem sind (vergessene) MessageBoxen auch später für den Spieler sichbar.
Wesentlich flexibler ist die Möglichkeit in lua einen print Befehl abzusetzen und so Wert von Variablen oder den Aktivitätsstatus einer Zone abzufragen.
In Abb.1 wird der Wert der Variable Punkte abgefragt um zu kontrollieren, welchen Wert sie an dieser bestimmten Stelle hat.
Wichtig ist, dass die Variable nicht nur den Namen sondern auch den Identifier "Punkte" besitzt, ansonsten müssten wir sie mit "ojbPunkte" ansprechen.

Abbildung 2: So sieht die Ausgabe im Simulator-Testlauf aus.
Wenn wir dann unser Projekt im Urwigo-Simulator starten, können wir im rechten Teil des Fensters auf Lua Debug umschalten um die print-Ausgabe im Bereich Result zu sehen. Im späteren Spiel -z.B auf dem Oregon- ist die Ausgabe nicht sichtbar, da auf dem Bildschirm nur MessageBoxen, Inputs & Co angezeigt werden.

Abbildung 3: Die Zone wurde verlassen. Da Punkte um einen Zähler erhöht wurde, hat die Variable nun den Wert 6
Was wir aber eigentlich testen wollten, war, ob der Wert für Punkte auch wirklich erhöht wird. Um das rauszufinden bauen wir im OnDistant Bereich wieder eine print-Anweisung ein. Und siehe da, beim Verlassen der Zone hat die Variable den Wert "6".
Etwas gewöhnungsbedürftig ist, dass wir "von unten nach oben" lesen müssen, denn die Print-Ausgaben werden nicht unter den bishierigen Text eingefügt, sondern oberhalb. Hier ist es sehr hilfreich nicht nur einfach den Wert der Variablen auszugeben, sondern auch den Kontext ("Zone X betreten", "Timer 1 gestart", usw) anzugeben.
Bitte nicht wundern, wenn in der untersten Zeile die Ausgabe "Punktestand beim Verlassen der Zone A 5" erscheinen sollte. Dies wird am Ende des Tutorials erläutert und kann erstmal ignoriert werden.

Abbildung 4: Man kann auch im Simulator während des Testlaufes Variablen abfragen.
Obwohl die print-Ausgaben nicht im späteren Lauf zu sehen sind, empfiehlt es sich, sie wieder herauszunehmen, wenn das Problem gelöst ist. Bei Abfragen, wo man vorher weiß, dass man sie nur einmal oder nur recht kurz gebraucht werden, oder bei Abfragen die einem während des Simulationslaufes erst einfallen, kann man sich auch des OnTheFly-Modus bedienen.
Dazu hackt man seine Anweisungen einfach in das Type in Lua Statements below Fenster und bekommt sofort die Ausgabe.
Doch Vorsicht: Im Gegensatz zur lua Programmierung im Urwigo-Projekt müssen mehrere Anweisungen durch das Semikolon getrennt werden.

Abbildung 5: Leere Ausgabe? Warum wurde nichts geschrieben?
Für diejenigen die sich über die tostring Methode aus Abb. 4 gewundert haben sei erklärt, dass die String-Konkatenation .. nicht mit Boolean-Werten funktioniert und wir deshalb den Boolean-Wert in einen String-Wert umwandeln müssen.
Bevor wir weitermachen leeren wir das Result Fenster mit einem Klick auf clear.
In Abb. 5 sehen wir was passiert, wenn wir diese Umwandlung weglassen ... nämlich gar nichts. Jedenfalls nichts sichbares. Im "unsichbaren Bereich" bricht die Routine ab. Weiter Anweisungen (z.B. "print(Player.Name);") würden nicht mehr ausgeführt.
Leider erscheint aber auch keine Fehlermeldung was schief gelaufen ist. Jedenfalls erscheit die Fehlermeldung nicht im Vordergrund. Wir können aber trotzdem geziehlt nachforschen warum nichts passiert indem wir auf MessageLog umschalten.
Hier sehen wir direkt, dass es zu einem ERROR gekommen ist. Nach einem Klick auf View Messages können wir die Fehlermeldung auch im Ganzen anschauen und erkennen so, den Grund für den N SCHWARZEN BILDSCHIRM HAB ICH! N SCHWARZEN BILDSCHIRM DAS GANZE WOCHENENDE!!. leeren Bildschirm:
[..] attempt to concatenate field 'Active' (a boolean value)
Als Lösung des Problems haben wir in Abb. 4 die tostring Methoden vor den Boolean-Wert geschaltet, sodass nicht String und Boolean, sondern zwei Strings konkateniert werden.

Abbildung 6: Fehleranlayse in "Message Log"
Wer ganz aufmerksam hinschaut, erkennt noch ein weiteres Problem. Obwohl der Player gerade erst gestartet war (die unteren beiden Zeilen) wird sofort das OnDistant Event auf ZoneA ausgelöst. (Eine Zeile darüber.) Ein Problem dass aus Zone als Kreis bereits bekannt ist. Es soll uns hier aber nicht weiter stören, erklärt aber warum die print-Ausgabe "Punktestand beim Verlassen der Zone A 5" beim Starten des Testlaufes erscheint.

Man kann auf diese Art natürlich nicht nur abfragen, sondern auch manipulieren. Hat man z.B. einen Fehler beim Final behoben und will nicht den ganzen WIG nochmals durchlaufen, kann man mit folgendem Code auch ganz leicht zum Final vorspringen:
Final.Active = true;
Final.Visible = true;

Doch Vorsicht: Manipulierender Code sollte man nur OnTheFly einsetzen, nie im Urwigo-Projekt verankern. Denn das Entfernen des Codes ist schnell vergessen und mit hochgeladen. Dann kann jeder Spieler direkt zum Final vorspringen, was wir natürlich nicht wollen.l
Wenn du dich etwas mehr mit lua-Programmierung beschäftigen möchtest, kann ich dir das "lua Einstiegs-Tutorial“ empfehlen.

Keine Kommentare:

Kommentar veröffentlichen