Mittwoch, 7. Juni 2017

Interaktion mit Personen unabhängig von Zonen

Voraussetzung: "Globaler Code - Teil II “


Abbildung 1: Die Person Sheldon ist erstmal nicht sichtbar, befindet sich in der unsichtbaren Hilfszone und hat eine eigene Koordinate
Nach langer Zeit gibt es aufgrund aktueller Inspiration mal wieder ein neues Tutorial. Dieses Mal geht es um das Thema Personen-statt-Zone.
Die Idee / die Anforderung ist, dass Personen losgelöst von einer Zone im Spielfeld verteilt sind und erst sichtbar sein sollen, wenn man nahe genug (hier 20 Meter Abstand) ist, um mit ihnen zu interagieren.
Gerade wenn viele Personen im Spiel sind und deswegen eine eigene Zone für die Person aus Performance Gründen ausscheidet, sollte dieser Ansatz als Alternativ zum bishierigen Umgang mit Personen / Gegenständen sein. (Ob Gegenstand oder Person ist egal, die Idee bleibt die gleiche).

Wir definieren zunächst eine Person namens "Sheldon". Diese ist stellvertretend für x weitere Personen die wir im Spiel später brauchen.
Wichtig ist, dass Sheldon zunächst unsichtbar ist, d.h. das Display-Flag ist deaktiviert. Zudem bekommt Sheldon eine eigene Koordinate, nämlich der Standpunkt an dem er im Spiel auf den Spieler wartet.


Abbildung 2: Die unsichtbare Zone dient nur dazu die Personen verfügbar zu machen.

Ganz ohne Zonen geht es leider nicht, denn eine Interaktion mit Personen ist nur möglich, wenn Spieler und Person sich entweder in der gleichen Zone befinden oder die Person dem Spieler zugeordnet wird. (Aber dann wären ja alle 30 Personen des Spieles immer sichtbar)
Wir lösen das Ganze über den Kniff einer unsichtbaren Zone, die nur aus einem Punkt besteht (Koordinaten beliebig), die zwar aktiv aber unsichtbar ist.
Diese Zone kann irgendwo liegen und sollte weit außerhalb des Spielfeldes gewählt werden.
Wichtig ist der Punkt, dass die Objekte der Zone immer sichtbar sind, deswegen Show objects = Always. Wir "tricksen" also Spieler-und-Person-in-einer-Zone aus

Sollte die Spielidee verlangen, dass man in einer Zone stehen und nahe genug an den Personen sein muss, lässt sich auch eine normale Zone nehmen und Show objects = On Enter setzen. So kann man umsetzen, dass man bei einer Mafia-Ralley in Köln im Stadteil Köln-Kalk sein und nahe genug an die Gangsterbosse kommen muss.
Wenn nur die Entfernung zur Person entscheident ist, empfiehlt sich die unsichtbare Zone.

Abbildung 3: Ermittle alle Personen
Wer diesen Blog schon etwas weiter studiert hat, kennt noch die Stelle an der allen Zonen ermittelt wurden. Ich habe diesen Code leicht abgeändert zu getCharacters in meine global.lua Datei gepackt, da ich ihn in mehreren WIGs immer wieder benötige. Man kann den Code aber auch einfach lokal ins lua des WIGs packen.
Wictig ist der Bezeichner / Identifier des Wherigos. Bei mir nenn ich ihn immer WIG, ansonsten wird Zeile 176 zu nem Fehler führen. Wenn ihr euren Wherigo anders bezeichnet, müsst ihr das dort anpassen.


Abbildung 4: Iteriere über alle Personen und mach die Sichtbarkeit von der Entfernung abhängig
Jetzt kommt der spannende Teil, nämlich wie werden Personen sichtbar gemacht wenn sie nahe genug sind, bzw. wie verschwinden sie wenn ich weiter laufe?
Dazu starten wir einen vorher definierten Timer (mit dem Identifier TPerson) und führen bei jeder Iteration folgendes aus (Zeile 14-17):
  • Iterieren über alle Character
  • Messe die Entfernung zu der Person und mache sie sichtbar wenn sie sich näher als 20 Meter zum Spieler befindet

Abbildung 5: Weit weg von allen Personen ist auch niemand sichtbar
Zur Berechnung des Abstandes (Zeile 1-4) bilden wir einen Vektor vom Spieler zur übergebenen Person. Zurückgegeben werden zwei Werte (lua ist schon ne geile Sprache !!!), die Entfernung und der Winkel zum Ziel.
Der Winkel interessiert uns nicht, die Entfernung geben wir uns in Metern zurück.
Der Timer ist bei mir auf ein Interval von 3 Sekunden gestellt. Wenn viele Personen im Spiel sind und die Abstände groß genug sind (30 oder 40 Meter), sollte man darüber nachdenken, ihn nur alle 5 oder 10 Sekunden anspringen zu lassen um die Performance des Oregons nicht zu stressen.

Da wir das Start-Event des Wherigos sowie die OnTick-Methode des Timers überschreiben, muss der Code in Lua user functions und nicht in Lua user directives eingebunden werden. Ansonsten kommt es zu einem Compile-Fehler (ja ich weiß, lua compiliert nicht) im Urwigo, da die OnStart / OnTick Methode doppelt vorhanden ist. Hängt mit dem Zeitpunkt zusammen, wann der lua code eingebunden wird.

Im Spiel sieht es dann so aus, dass zu Beginn niemand zu sehen ist....


Abbildung 6: Sheldon, der auf der Kreuzung steht, ist nun sichtbar
... kommen wir dann zur Kreugung an der Sheldon wartet, so wird er sichtbar und wir können mit ihm interagieren

Montag, 21. Dezember 2015

Die Beerdigung der Fußballerzitate


Abbildung 1: Die (Fußballerzitate) Welt wird untergehen
Viele viele Anfrage gab es für die Zitate, die ich mit Freuden beantwortet habe. Sie haben mir gezeigt, wieviel Spaß (und kreative Ansätze) die Finder beim Lösen hatten.
Unzählige Logs haben sich in Dosen und online angesammelt.


Abbildung 2: Auch wenn die Runde archiviert wird, das Leben geht weiter
Doch auch hier ist irgendwann Schluss. Mehr und mehr Verstecke sind "verbrannt", werden immer wieder gemuggelt, sodass nun das Ende erreicht ist und die Runde am 01.01.16 archiviert wird.


Abbildung 3: Wir haben fertig
Für all diejenigen, die noch eine letzte Chance wahren wollen, treffen wir uns am Neujahrstag um 10 Uhr am Asbacher Sportplatz

N 50° 39.636 E 7° 25.805

von wo aus wir die Runde starten wollen.

Montag, 8. Juni 2015

Die Zitate des Herr Seppberger

Nach unbestätigten Informationen wurde 1954 in Bern nicht nur der Name des deutschen Dosennationaltrainer, nein auch die Sportart und vorallem die Zitate wurden falsch überliefert.

Hier die "korrigierte Fassung":
  • "Nach dem Event ist vor dem Event"
  • "Das Blaue muss ins Eckige im Runden"
  • "Die nächste Dose ist immer die schwerste"
  • "Die Dose ist rund und ein Event dauert 90 Evmis *"
  • "11 Dosen müsst ihr sein"
  • ...
Wer noch weitere Infos über die "Originalzitate" besitzt, kann mir diese gerne zukommen lassen, vielleicht gibt es dann wieder ne Mysteryseria à la Fußballerzitate

* Evmis sind Eventminuten, eine flexible Zeiteinheit, die von 45 Sekunden beim Mittagspausenevent bis zu 64 Minuten beim Viertageswanderevent gehen kann. Selbst Minus 45 Sekunden für das Zeitumstellungsevent nachts um 3 bis nachts um 2 sind möglich

Samstag, 7. März 2015

Koordinaten ermitteln und automatisch umrechnen lassen

Ich stand letzte Woche wieder vor dem Problem schnell ne Koordinate aus GoogleMaps auszulesen und diese dann in das passende lua-Format zu wandeln.
Auch die Eingabe in Uriwgo ist immer noch mit ein wenig Fleiß verbunden. Zwar bietet dieser Editor zwar mittlerweile das Minutenformat an, aber die ° Grad Zeichen müssen noch entfernt werden und die N bzw E Himmelsrichtungen ans Ende gepackt werden. Das kann schon nervig werden.

Viel schöner wäre es doch, wenn man diese Schritte verkürzen könnte.
Ich habe mir zu diesem Zwecke eine kleine WebSite angelegt, die man unter JSFiddle jederseit online nutzen kann.
Was sie kann und wie man sie bedient, möchte ich Euch hier einmal vorstellen:


Abbildung 1: Beim Start versucht sich die Karte auf den aktuellen Standort zu zentrieren.
Beim Start versucht die WebSite den aktuellen Standort des Benutzers zu ermitteln und fragt ihn dazu um Erlaubnis. Hier empfehle ich "Zulassen" auszuwählen.
Alternativ kann man aber auch die Eingabemaske nutzen um die Karte an die richtige Stelle springen zu lassen und den Schiebeaufwand zu verringern.

Abbildung 2: Einfache Eingabe von Orts- und Straßenname um die Karte grob auszurichten
Einfach in das Suchfeld ("Search Box") Ort und Straße eintragen und Enter drücken. Schon sind wir an der richtigen Stelle.
Zumindest grob. Den Rest können wir durch Verschieben der Karte erreichen.


Abbildung 3: Mit der rechten Maustaste werden die Koors in die Header-Felder geschrieben
Wenn die gewünschte Stelle erreicht ist, so genügt ein einfacher rechter Mausklick auf den gesuchten Wald / Parkplatz oder was auch immer sonst ausgemessen werden soll.
In den Header-Feldern erscheinen nun die Koors im Dezimalminutenformat, in der von Urwigo gewünschtne Schreibweise und als Wherigo.Zonepoint wie ihr ihn benötigt, wenn die Koordinate direkt in lua eingetragen werden soll.


Abbildung 4: Eine Änderung im Dezimalminutenfeld führt zur Anpassung des Urwigo- und lua-Feldes
Jetzt reicht es bei Parkplatzkoordinaten ja meistens aus mit GoogleMaps zu messen. Bei vielen Station möchte man aber die vor Ort mit dem GPSr ermittelten Koors verwenden.
Um diese in die beiden Wherigo-Formate zu bekommen, könnt ihr einfach das Dezimalminutenfeld anpassen und die Werte aktualisieren sich automatisch
Jetzt per Copy&Paste nach Urwigo übernehmen und fertig ist der nächst Wherigo. Zumindest was die Koors betrifft....

Mittwoch, 18. Februar 2015

Stillstand bei Uriwgo?

Wie viele Wherigo-Entwickler wurde auch ich eben mit einem Urwigo-Problem konfrontiert, dass man sonst nur hat, wenn man das Cartridge zu schnell startet.

Nachdem ich das Programm mehrere Male neu gestartet, schließlich neu installiert habe .... und immer noch nix lief, hab ich dann mal in den Geoclub geschaut. Und siehe da: Wie vermutet liegt es am GoogleMaps Zugriff. Lt. Charlenni arbeitet Uriwgo wohl schon länger mit der als Deprecated deklarierten V2 der Google Maps API anstatt auf die V3 upzugraden. Und heute schon Google aus Deprecated ==> Unavailable gemacht zu haben. Jedenfalls funktioniert der API Zugriff nicht mehr.
Hoffen wir, dass die Urwigo Entwickler nun endlich das Update auf die V3 vollziehen.

Quelle: https://forum.geoclub.de/viewtopic.php?f=74&t=76575

Montag, 2. Februar 2015

Auf den Spuren vom Rühmanns Heinz...

Nur noch ein paar mal schlafen, dann ist es endlich soweit. Mitten in der Karnevalszeit sozusagen als Auszeit und Abwechslung startet in der Weltstadt Birnbach das

Jaja, es ist alle geboten. Beamer, Leinwand, DVD, ne gemütliche Grillhütte.
Auch der Birnbacher Flughafen wird geöffnet haben. Jedenfalls wird Louping Louie dort desöfteren starten und laden...

Sonntag, 9. November 2014

Nachrichten asynchron anzeigen mit einer Messag-Queue

Voraussetzung: "Der Einstieg in lua“

Abbildung 1: Wenn die Nachricht unpassend ist, wird sie später angezeigt

In diesem Beitrag geht es um asynchrone Nachrichtenverarbeitung. Klingt komplizierter als es ist, deswegen will ich es mal an einem einfachen Beispiel erklären:

Stellt euch vor in eurem Wherigo-Spiel geschieht gerade ein längerer Dialog. Der Spieler muss 3-4 Fragen beantworten auf die er jeweils direkt eine Antwort bekommt.

Dazu habt ihr einen Timer der im Hintergrund einmal pro Minute etwas prüft und gegebenenfalls eine Nachricht anzeigt "Die Löwen sind wieder hungrig und möchten gefüttert werden"
Nicht nur dass die Nachricht Umlaute enthält, nein sie würde auch im aktuellen schwierigen Dialog stören bzw. wichtige Informationen überlagern.

Stellt euch vor, der Spieler erhält gerade die dringende Nachricht "Gehe schnell zum Affengehege" als der Timer anspringt und sofort mit der wenig dringenden Löwennachricht überlagert. Da wüsste der Spieler gar nicht, dass er zuerst du den Affen soll.

Um dass zu verhindern nutze ich eine Mesage-Queue in die ich Nachrichten einstelle (Zeile 174), wenn sie gerade unpassend sind. Wenn sie gerade nicht stören, also hideMessage auf false steht können sie auch direkt angezeigt werden.
Die msgQueue besteht aus einer Tabelle in die mit table.insert ein Text sowie ein Bild eingefügt wird, um später die Nachricht darzustellen.
Zusätzlich hält das Array-Objekt noch einen Pointer, der auf die nächste darzustellende Nachricht zeigt.

Wenn dann die kritische Situation vorbei ist (Der Dialog ist beendet, oder immer wenn der Spieler eine Zone verlässt) wird printMessageFromQueue aufgerufen. Diese Methode prüft ob neue Nachrichten vorhanden sind (dann wenn mehr Nachrichten im Array sind als der Pointer groß ist) und gibt die Nachricht aus auf die der Pointer zeigt.
Nach Drücken von "OK" durch den Spieler wird der Pointer einen weitergesetzt und printMessageFromQueue rekursiv aufgerufen. Solange bis alle Nachricht abgearbeitet, also angezeigt wurden.


Abbildung 2: Während der Dialog mit dem Spieler etwas länger dauert, springt der Timer an und schiebt die Nachricht in die Queue
Abb. 2 zeigt uns die Anwendung im Code. Die Methode doLongDialog soll den komplizierten Frage-Antwort-Dialog simulieren. Bevor der Dialog startet wird hideMessage auf true gesetzt. Ab jetzt gehen alle Nachrichten in die Queue.
Zeile 206 bis 208 zeigen uns den Timerfall. Während der Timer anspringt ist hideMessage positiv und die Nachricht wird eingereiht.

Nachdem der Dialog vorbei ist, wird (!!! Im Callback des letzten Dialogs / MessageBox !!!) hideMessage wieder auf false gesetzt, damit ab jetzt wieder live angezeigt werden kann, da die kritische Situation vorbei ist.

Wenn es in eurem Spiel keinen festdefinierten Zeitpunkt gibt, wann die Nachrichten nachgeholt werden können, könnt ihr mit einem weiteren Timer arbeiten, der alle 60 Sekunden prüft ob hideMessage auf false steht und dann printMessageFromQueue aufruft.


Abbildung 3: Egal ob direkt oder später, die Nachricht erscheint als MessageBox