Freitag, 15. Juni 2012

Wie man einen PlayAnywhere Wherigo schreibt

Voraussetzung: "Einstieg in Lua“

Abbildung 1. Aus zwei gemessenen Punkten lässt sich Abstand und Winkel bestimmen.
In diesem Tutorial wollen wir uns mit der PlayAnywhere (kurz PA) Variante der WIGs befassen. PlayAnywhere heißt hier, dass der Spieler festlegt, wo er das Cartridge spielen möchte.
Da wir die Zonen folglich nicht vorher bestimmen können, muss dies der Spieler tun.
Das Zauberwort lautet Player.ObjectLocation. Diese Funktion liefert uns ein ZonePoint Objekt, dass die Koors des aktuellen Spielstandortes Preis gibt.
Wir stecken uns folgendes Ziel: Der Spieler soll zwei Punkte festlegen, anhand deren wir dann ein Quadrat berechnen. Die Seitelänge des Quadrates ist der Abstand der beiden Koordinaten und die Verbindung zwischen Ihnen eine Seite des Vierecks.

Abbildung 2: Die erste Position wird gemessen
Wir geben eine MessageBox aus mit der Bitte zur ersten Position zu gehen. Sobald der OK-Button der MessageBox gedrückt wird, halten wir die aktuelle Spielerposition in der Variable position1 fest
So weit zu gut, eine Ecke des Quadrates ist bestimmt. Um die zweite Ecke zu bestimmen fügen wir, ebenfalls im "On clicked" Bereich der MessageBox eine zweite Nachricht ein und wiederholen so die Prozedur der Aufforderung und Messung.

Abbildung 3: Nachdem die zweite Position bestimmt wurde, werden die Ecken 3 und 4 errechent.
Nachdem die zweite Position in position2 gespeichert wurde beginnt die eigentliche Arbeit. Die vorgefertigte Funktion VectorToPoint, enthalten in der eingebundenen Wherigo-Bibliothek erwartet als Parameter zwei ZonePoint Objekte und berechnet Abstand und Winkel der beiden Positionen. Der Winkel wird in einem 360° Kreis gemessen (Osten 90°, Süden 180°, Westen 270° usw) und sollte uns von Peilungsaufgaben bekannt vorkommen. In Abb. 1 würde der Winkel bei etwa 340° liegen sollte.
Um es genau zu wissen, geben wir Abstand und Winkel in einer print Nachricht aus, die nur im Urwigo-Simulator, nicht auf dem WherigoPlayer (Oregon, WhereYouGo...) angezeigt wird. Da das Distance-Objekt d nicht automatisch in Meter angegeben wird, bestimmen wir den Wert mit d:GetValue"m".
Vorsicht: d:GetValue("m") ist zwar syntaktisch auch korrekt, funktioniert aber nicht auf allen WIG-Playern. Bei unserem Beispiel sieht die Ausgabe folgendermaßen aus:
Winkel 338.97394387323 Grad
Entfernung 49.227289103145 m
    
Als kleine Zwischenaufgabe wollen wir einen Wegpunkt bestimmen, der 5 Meter Richtung Osten von Position 1 entfernt ist. Dazu erzeugen wir mit Wherigo.Distance(5,'m') ein entsprechendes Distance-Object und mit Wherigo.TranslatePoint einen neuen ZonePoint, ausgehend von Position 1, 5 Meter in Richtung 90 ° gehend. Die Vektorrechnung aus der Schulzeit lässt grüßen.

Nun aber genug getestet, wir benötigen die dritte Ecke (oben rechts, siehe Abb. 4) unseres Quadrates. Was wir über diese Ecke wissen, ist, dass ihr Abstand zu Position 2 der gleiche ist, wie der zwischen 1 und 2. Beim Quadrat sind ja allen Seiten gleich lang. Für Wherigo.TranslatePoint haben wir also schon den Ausgangspunkt position2 und den Abstand d. Wie aber kommen wir zum Winkel b2 ? Diese Frage lässt sich recht schnell beantworten, wenn wir bedenken, dass die Innenwinkel eines Quadrates 90° sind. Winkel b2 ist also Winkel b zuzüglich 90°. Für den Fall, dass der Winkel größer als 360 wird, nehmen wir mittels Modulo den Wert zwischen 0 und 360. Mit dem so errechneten Winkel können wir Position 3 und von dort ausgehend wieder 90° weiter Position 4 errechnen. An der Zeile b3 = b2 + 90 sehen wir, dass wir die Modulo-Operation auch weglassen können, da die in lua genutzen Sinusfunktionen auch Winkel größer 360° vertragen.
Zuletzt setzen wir mit myZone.Points die vier bestimmten bzw. errechneten Position für unsere Zone myZone. Damit die Zonendarstellung im Wherigo-Player aktualisiert wird sollten wir die Sichtbarkeit der Zone mit myZone.Visible zuerst auf false und anschließend wieder auf true setzen.
!!! Damit ihr eure Zone mit myZone ansprechen könnt, müsst ihr bei der Definition der Zone in Urwigo nicht nur den Namen sondern auch den Identifier auf myZone setzen.

Abbildung 4: Unser Quadrat ist fertig und kann als Zone im PlayAnywhere-Cartridge genutzt werden.
Wir haben somit die Koordinaten der Zone auf den Standort gesetzt in dem der Spieler das Cartridge spielen möchte.
Das Handling mit Quadraten als Zone ist aber nicht zwingend erforderlich um einen PA zu erzeugen. Wenn die Zone ein Viereck sein soll, kann man auch die ersten 3 Ecken bestimmen lassen. Somit hat der Spieler auch eher eine Vorstellung wo sich das Spielfeld befindet und kann auch auf nicht rechtwinkligen Spielfeldern (wer weiß noch was ein Parallelogramm ist ?) die Zone definieren.

Abbildung 5: Bei der PA-Variante von Cachopoly werden alle 4 Ecken bestimmt und die Zwischenstationen ausgerechnet.
Ebenso denkbar ist, dass bei einem Spielfeld wie Cachopoly alle 4 Ecken gemessen werden. Hier werden die 4 Eckfelder (Homezone, Hochsitz, Parkplatz und Jäger) als Kreiszonen bestimmt und die Zwischenstationen (Muggelhausen, Filmdosenverleih, Stammtisch, Enigma...) berechnet, indem man den Winkel Homezone -> Hochsitz nimmt und von der Homezone aus 1/5, 2/5, 3/5 bzw. 4/5 der Entfernung für die Peilung mit Wherigo.TranslatePoint heranzieht. Grundgedanke ist aber immer, dass der Spieler genügend ZonePoints setzen muss, um das Spielfeld eindeutig aufzuziehen. Wer sich Spielfrust ersparen möchte, sollte im Cachelisting genau beschreiben was der Spieler gerade ausmisst. ("Setze mit Punkt A und B eine Gerade. Das Spielquadrat befindet sich anschließend rechts von dieser")

Keine Kommentare:

Kommentar veröffentlichen