Samstag, 7. Januar 2012

Timer II - Countdown

Fortschrittskurs „Timer II - Countdown“


Voraussetzung: "Forschrittskurs „Timer I - Zeitstress“


Wir nehmen uns das Cartrigde aus „Timer I – Zeitmessung“ und ersetzen den normalen Timer durch einen Countdown. Ziel ist es permanent die Restzeit („Noch 50 Sekunden“, „Noch 49 Sekunden“ usw.) anzugezeigen.
Dazu erstellen wir eine Zahlvariable „TimeLeft“, die auf 60 (Sekunden) eingestellt ist und einen zweiten Timer names „Countdown“, bei deren Ablauf folgendes passieren soll: Ist „TimeLeft“ noch größer als 0, so wird die Restzeit in einer Message angezeigt, die sich jede Sekunden erneuert und damit die alte überlagert. Anschließend minimieren wir den Wert um einen Zähler.
Ist der Spieler nicht schnell genug und „TimeLeft“ erreicht den Wert 0 wird wie beim alten Timer die Booleanvariable „SatelliteReached“ auf „False“ gesetzt, der Misserfolg gemeldet und der Timer gestoppt.
Der letzte Schritt muss unbedingt im „On clicked“-Bereich erfolgen, da der Timer nur gestoppt werden kann, wenn er sich nicht in einem Verarbeitungsschritt befindet. Wie bereits im Anfängerkurs angesprochen stoppt der Programmablauf nicht, wenn die MessageBox erscheint. D.h. Im Hintergrund wird die „On elapsed“ Routine weiter abgearbeitet. Wenn der Spieler die Meldung mit OK bestätigt, ist die Routine beendet und der Timer kann gestoppt werden.

Abbildung 1: Der „Countdown“-Timer läuft jede Sekunde ab, zeigt die Restlaufzeit an und verringert den Wert anschließend

Wenn wir Abb. 1 genauer betrachten, entdecken wir, dass der Timer auf Interval mit einer Laufzeit von einer Sekunde eingestellt ist. In diesem Modus startet der Timer immer wieder automatisch bis er explizit gestoppt. Das Ereignis „On start“ wird aber nur beim ersten Start ausgeführt.
Da durch die ständig erscheinende Message der Spieler die Zone „Satellitenstation“ nicht mehr auswählen kann, ist es wichtig dass er vor Erreichen des Labors weiß, wohin er laufen muss. Gegebenenfalls sollte man früh genug eine Wegbeschreibung („Laufe die Straße runter, dann rechts bis zum Baum“) anzeigen.
Um die Änderung wirksam werden zu lassen, ersetzen wir in der Labor- bzw. der Satellitenstationsannäherung beim „Start Timer“ / „Stop Timer“ Modul den „SatelliteLifeline“- durch den „Countdown“-Timer.
Abbildung 2: Beim Erreichen des Labors muss nun der Countdown-Timer gestartet werden Abbildung 3: Auch in der Satellitenstation wurde der alte Timer durch unseren Countdown ersetzt


Das urwigo Projekt zu diesem Tutorial als Download"

Timer I - Zeitstress

Fortschrittskurs „Timer I - Zeitmessung“


Voraussetzung: "Forschrittskurs „Zone als Kreis“


In diesem Tutorial wollen wir unser Augenmerk auf das Thema Timer richten.
Mit Timern lassen sich viele nützliche Features im Cartrigde einbauen. So wollen wir zu Beginn den Spieler ein wenig sprinten lassen und die benötigte Zeit mittels Timer kontrollieren.
Der Spieler erreicht im Demospiel eine Bergstation und erhält dort die Nachricht, dass er zur Finalsuche einen Spoiler bei der Satellitenstation erhalten kann. Diese muss er aber in den nächsten 60 Sekunden erreichen, sonst ist der Satellit weitergeflogen und kann nicht mehr genutzt werden.
Die Grundidee unserer Implementierung zielt darauf ab, dass ein Timer gestartet wird, der – wenn nicht rechtzeitig gestoppt den Satellit verschwinden lässt. Sicherlich könnte man diese Aufgabe auch mit einer Start- und einer Endzeit lösen, in der späteren Erweiterung sehen wir aber wie praktisch Timer sein können.
Das erste Problem besteht im Zeitpunkt des Startes. Wenn wir den Countdown sofort starten, geht dem Spieler wertvolle Zeit während des Lesens verloren.
Wenn der Timer erst nach dem Bestätigen der Nachricht startet, kann der Spieler mogeln indem er bequem zur Satellitenstation schlendert und dann erst auf OK drückt.
Eine Möglichkeit wäre den Start mit dem „On leave“ Event der Zone zu verknüpfen. Da wir aber die Stationen als Punkte und nicht als Vieleck definieren (Siehe Tutorial „Zone als Kreis“) würde „On leave“ nie ausgelöst. Man kann das Problem zwar mit „On distant“ lösen, dies hat aber einige Nebenwirkungen, wie wir im Kreistutorial gesehen haben.
Wir wählen deshalb einen Lösungsansatz mit einer Zwischenstation namens Labor. Sie liegt auf dem Weg zur Satellitenstation und beim Annähern kündigt ein Bildschirm an, dass es nun losgeht.
Dies hat zudem den Vorteil, dass sich der Spieler in Ruhe auf die kommende „Stresssitualtion“ einstellen kann.
Abbildung 1: Ankündigung eines Spezialjokers wenn die sportliche Aufgabe erfüllt ist

Abb. 1 zeigt uns den Ablauf beim Annähern an die Bergstation.
Neben der Informationsmeldung an den Spieler, werden die beiden Zone Labor und Satellitenstation aktiv geschaltet. Ich setze diese Werte bewusst bereits jetzt, damit der Spieler genügend Zeit besitzt, sich ein Bild zu machen wo er hin laufen muss.
Abbildung 2: Beim Erreichen des Labors nimmt die Sache Fahrt auf


Sobald wir das Labor erreichen (Abb. 2), nimmt unser Spielablauf Fahrt auf, der Timer wird gestartet.
Was uns noch auffällt ist die Variable „SatelliteReached“, die hier auf „True“ gesetzt wird. Mit ihrer Hilfe können wir beim Erreichen der Satellitenstation feststellen, ob wir schnell genug waren oder nicht.
In Abb. 3 sehen wir, dass dieser Wert auf False gesetzt wird, wenn der Timer abgelaufen ist.
Ansonsten ist ein Timer nicht wirklich schwer zu verstehen. Neben dem Namen können wir den Modus (Countdown oder Intervall) wählen sowie die Laufzeit in Sekunden einstellen.
Wir haben drei verschiedene Ereignisse, die verarbeitet werden können. Neben dem Starten und dem Stoppen gibt es ein eigenes Ereignis für den Ablauf des Timers, das vom System aufgerufen wird wenn die eingestellte Zeit abgelaufen ist.

Abbildung 3: Wenn die 60 Sekunden abgelaufen sind, verfällt die Chance auf den Spoiler


Wenn wir völlig außer Puste das Ziel unseres Kurzstreckenlaufes erreicht haben, kommt die Stunde der Wahrheit. Als allererstes stoppen wir den Timer, denn nun soll er nicht mehr ablaufen bzw. den Wert von „SatelliteReached“ zu unserem Nachteil verändern. Wenn wir schnell genug waren, dann besitzt diese Variable immer noch den Wert „True“ und wir stellen dem Spieler den Spoiler zur Verfügung
Da wir die Satellitenstation nun nicht mehr brauchen, deaktiviert wir sie und der Spieler kann zum Final vorrücken

Abbildung 4: Beim Erreichen der Satellitenstation entscheidet sich, um man schnell genug war

Noch ein Tipp nebenbei: Da wir „SatelliteReached“ erst in der Laborstation von „False“ auf „True“ gesetzt wurde, haben wir uns auch gegen den Mogelversuch gewehrt, dass der Spieler direkt zur Satellitenstation läuft ohne vorher beim Labor vorbeizuschauen. Denn dann wird der Variablenwert nie auf „True“ gesetzt.


Man kann diesen Sicherheitscheck auch aufwändiger betreiben und eine Booleanvariable „LaborPassed“ einfügen, die beim Erreichen des Labors auf „True“ gesetzt wird. Diese Variante hätte den Vorteil, dass man dem User gezielt mit einer Message auf seinen Fehler hinweisen könnte.


Das urwigo Projekt zu diesem Tutorial als Download"

Sonntag, 1. Januar 2012

Zone als Kreis

Fortschrittskurs „Zone als Kreis“

Voraussetzung: Einsteigerkurs

Als Eintritt in den Fortschrittskurs wollen wir uns nochmal mit der Definition von Zonen beschäftigen.
Im Einsteigerkurs haben wir unsere Zonen mit 4 Punkten abgesteckt und "On enter" implementiert.
Abbildung 1: Statt alle vier Ecken zu messen reicht es den Mittelpunkt und den Radius anzugeben
Bei dieser Vorgehensweise kommt es immer wieder zu Problemen im Spielablauf indem der Wherigo-Player entweder eine Ecke der Zone anvisiert um seinen Richtungspfeil auszurichten, oder der Wherigo-Builder aktualisiert den OriginalPoint der Zone, an dem sich viele Player orientieren, nicht wenn die Zone nachträglich verschoben wird.
Wenn man die Zone nicht genau abstecken muss und auch gut mit einem Kreis leben kann, so sparen wir uns die Mühe mehrere Punkte zu messen und bauen ein Minidreieck mit dreimal Kreismittelpunkt als Koordinaten.
Über "In proximity" lässt sich der Radius des Kreises bestimmen.
Anstatt sich „On enter“ zu bedienen wird der Programmablauf beim Erreichen einer Station in „On proximity“ definiert.
Wenn ihr Objekte in der Zone platzieren wollt, die dem Spieler angezeigt werden sollen, müsst ihr „Show Objects“ auf „On proximity“ umstellen.

Der Vorteil der Methode liegt auf der Hand: Der Spieler navigiert genau auf den Zonenmittelpunkt und als Cacheowner reicht es einen Punkt zu messen. Denn meistens möchte man den Spieler an einem bestimmten Punkt führen.
Als weiteren Nebeneffekt simuliert ihr Geschwindigkeit und reibungslosen Programmablauf, denn der Spieler erhält sehr genaue Angaben wo er hin laufen soll und das Ereignis tritt schneller ein als erwartet.
Das Verlassen der Zone muss mit "On distant" erfasst werden,
da unsere eigentlicht Zone nur aus einem Punkt besteht
„Noch 12 Meter ... noch 11 Meter ... 'Welche Zahl steht auf den Boden gemalt?' “

Fairerweise sollte nicht unerwähnt bleiben, dass diese Lösung auch Nachteile besitzt. Genauso wie „On enter“ steht auch auch „On exit“ nicht zur Verfügung, da die eigentliche Zone ja nur aus einem Punkt besteht.
Abhilfe kann da aber „On distant“ verschaffen. Dieses Ereignis stellt quasi das Gegenteil zu „On proximity“ dar und wird ausgelöst, wenn der Annäherungsbereich verlassen wird.
Aber auch hier steckt der Teufel im Detail, denn „On distant“ wird von den Playern auch beim Start des Cartridges ausgelöst.

Ob "On distant" ausgeführt wird, hängt von der Variable "GameOnStart" ab
Wir lösen dieses Problem mit einer Booleanvariable „GameOnStart“, die initial auf „True“ steht und beim Erreichen der ersten Zone auf „False“ gesetzt wird.

Beim Erreichen der ersten Zone wird "GameOnStart" auf "False" gesetzt
TEXT Im „On distant“ Block muss dann lediglich eine Überprüfung auf den „GameOnStart“ Wert stattfinden.
Man kann also die Kreisfunktion mit der „On distant“ Methode nutzen, evtl. ist aber ein traditionelles Vieleck als Zone mit „On exit“ Funktion einfacher zu implementieren.
Es kommt halt immer auf die Situation an.

Die urwigo Datei zu diesem Tutorial als Download