WiG-Trick #1: Abstandsbestimmung selbst gemacht; Teil 2: „Es wird sphärisch“

Im ersten Teil des Tutorials haben wir uns mit den Grundlagen beschäftigt, nun wollen wir unser gewonnenes Wissen anwenden.

Wie wir an die Koordinaten eines Punktes kommen wissen wir bereits, im nächsten Schritt wollen wir nun die Entfernung zwischen zwei Koordinaten berechnen. Nun könnte man sich an seine Schulzeit erinnern, oder die alten Bücher aufschlagen und nachlesen, wie man den Abstand zwischen zwei Koordinaten berechnet – die Formel ist nicht allzu schwer und liefert für kleine Abstände auch ein brauchbares Ergebnis, die Sache hat bloß einen Haken: In der Schule haben wir uns im zweidimensionalen Raum bewegt, in der ‚Wirklichkeit‘ befinden wir uns aber auf der Erdoberfläche und diese ist bekanntlich eine Kugel (naja, nicht ganz, aber bis zu einem gewissen Grad kann man das annehmen). Um also auch für größere Distanzen ein brauchbares Ergebnis zu erzielen, benötigen wir eine genauere Formel. Glücklicherweise wurde diese Formel bereits in den Standardfunktionskatalog von Wherigo mit eingebaut. Der Syntax sieht folgendermaßen aus:

Wherigo.VectorToPoint(p1, p2)

p1 und p2 sind zwei Variablen vom Typ ZonePoint, den wir bereits in Teil 1 kennengelernt haben. Wir erinnern uns kurz zurück, an welcher Stelle ZonePoints verwendet werden:

1. Bei der aktuellen Position des Spielers:  Player.ObjectLocation

2. Beim Zonenmittelpunkt: zonenName.OriginalPoint

Folgerichtig berechnet der folgende Code den Abstand zwischen der aktuellen Spielerposition und der Zonenmitte:

Wherigo.VectorToPoint(Player.ObjectLocation, zonenName.OriginalPoint)

Diese Funktion berechnet aber nicht nur den Abstand, sondern liefert uns auch noch einen zweiten Wert: den Winkel, bzw. Kurs (bearing) zwischen beiden Punkten. Das mag für den ein oder anderen nun etwas komisch klingen, da das gleichzeitige Zurückgeben mehrerer Werte in anderen Programmiersprachen nicht ohne weiteres möglich ist, in Lua ist dies aber problemlos möglich. Um die Werte zu speichern, verwendet man folgenden Code:

entfernung, winkel = Wherigo.VectorToPoint(Player.ObjectLocation, zonenName.OriginalPoint)

Die Entfernung wird in der ersten Variable gespeichert, der Winkel in der zweiten.

So weit, so gut – könnte man meinen, denn auch hier gibt es noch ein kleines Problem! Bis zum Wherigo-Player in der Version 3.17 für das iPhone war es nämlich so, dass die oben beschriebene Funktion ein falsches Ergebnis zurückgelieferte. Aus diesem Grund implementieren wir einfach unsere eigene Funktion, die der eingebauten in nichts nachsteht:

Zu beachten ist auch hier wieder, dass beide Funktionen für den Abstand keinen numerischer Wert zurückgeben, sondern ein Distance-Objekt!

Gelegentlich kann es interessant sein, nicht die Entfernung zum Zonenmittelpunkt zu bestimmen, sondern zu einem der Randpunkte. Dazu schauen wir uns noch einmal den Aufbau der Zone an und kommen zu folgendem Stück Code:

Wherigo.VectorToPoint(Player.ObjectLocation, zonenName.Points[2])

Hier wird nun der Abstand zwischen Spielerposition und dem zweiten Randpunkt der Zone bestimmt.

 

Zum Abschluss gibt es wieder ein kleines Urwigo-Projekt für euch, mit dem ihr die Funktionen testen könnt: Hier geht’s zum Download

 

Teil 3: Ein Anwendungsbeispiel (folgt)

 

Links zum Thema:

No comments have been made. Use this form to start the conversation :)

Leave a Reply

Facebook
Facebook