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