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"

7 Kommentare:

  1. Hi Krolock,
    klasse Tutorial, der Countdown läuft bestens! Danke fürs bereitstellen.
    Eine kleines Problem hab ich, die Anzeige der Restzeitanzeige ist immer on Top, somit kann der Player nicht mehr sehen wohin er gehen soll.
    Gibts hier ne Möglichkeit das umschaltbar zu machen?

    AntwortenLöschen
    Antworten
    1. Hallo Wolle,
      das Problem lässt sich leider so nicht umgehen, da jede Sekunde der Bildschirm mit der Zeitanzeige überlagert wird.
      Du kannst das Problem mit nem Item umgehen, dessen Description den Wert der Restzeit aktualisiert wird. Dann wird der Counter nur angezeigt, wenn man das Item (z.B "Restzeit" anklickt.) Ob das die User aber in den paar Sekunden realisieren, wage ich zu bezweifeln....

      Löschen
  2. A very good tutorial. I've understood how time works in game. My question is: how in Urwigo convert seconds into minutes. Could you try to explain on upper exapmle? Sorry for my simple english

    AntwortenLöschen
  3. @Unknown: If you see at picture 1 you have to replace the "Time Left" variable block with a math operation if it is available at uriwigo (i have access to urwigo at the moment) or you repace it with a lua block where you devide seconds by 60. It the result is a float instead of an integer you have to round it off. Maybe a public an example the next days here

    AntwortenLöschen
  4. Super - I wil wait for en example. I like your blog very much. I'am nobies in making Wherigo games, but I like this kind of geocaching with using Wherigo. I'm writting my first scenario. Tell me: when I will have questions could I ask you about help?

    AntwortenLöschen
  5. I did as you suggested, but my timer show me time like: 59,78. I would like get time as min:sec. How to do it?

    AntwortenLöschen
  6. Hi. I found something like this:
    local sec, min
    sec = ztimerClock.Remaining % 60
    min = (seconds - sec) / 60
    Wherigo.MessageBox{Text="You have " .. min .. ":" .. sec .. " left."}
    but I don't know how use it in Urwigo :(
    My timer's name is CzasEdmunda Such suggestion? Lua User Code? Lua user expression? Where it should be written in block? I have poor knowleagde about programming at all (I'm a doctor).

    AntwortenLöschen