• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Pfad einer wandernden Zone festlegen

hmpfgnrrr

Geocacher
Hallo!

Ich habe ein ähnliches Problem mit einer wandernden Zone wie
http://forum.geoclub.de/viewtopic.php?f=74&t=65339 schrieb:
geschildert. Bei mir kommt es aber nicht darauf an, Abstand zu halten oder die Person einzuholen. Man soll ihr einfach nachlaufen (etwa 1-1,5 km weit!), und zwar auf einem festgelegten Kurs.

Das prinzipielle Vorgehen ist mir klar. Ich habe eigentlich zwei Möglichkeiten:
1) entlang des Weges viele Zonen anlegen (im 50-100 m Abstand) und dann jeweils bei OnProximity zur nächsten schalten. Das gibt zum einen eine ziemliche Ruckbewegung, zum anderen wird das in Urwigo dann schnell unübersichtlich.
2) das ganze mit LUA realisieren. Dann könnte ich den Pfad mit deutlich mehr Wegpunkten in einer Tabelle anlegen und dann ebenfalls mit OnProximity abarbeiten. Hat den Vorteil, dass es sauberer programmiert ist und "smoother" abläuft.

Mein "Problem" ist, dass ich mich mit LUA nun so gar nicht auskenne, und mich komplett einarbeiten müsste (immerhin habe ich etwas Python-Erfahrung, was mir ähnlich zu sein scheint).

Daher meine Frage an die Cracks, ob sich der Aufwand für das Einarbeiten lohnt, wie kompliziert das werden könnte, oder ob ich doch lieber die "Quick and Dirty"-Variante per Urwigo wählen sollte.

Gruß,
Thomas.
 

docfred

Geocacher
Man könnte auch die Mittelpunkte der möglichen Zonenpositionen in einen table schreiben und beim Unterschreiten des Abstandes zur Zone/zum Mittelpunkt (nach der von bodenseepingu beschriebenen Methode) die Zone so verschieben, sodass der nächste Punkt neuer Mittelpunkt ist. Es würde dann reichen Zonenmittelpunkte im Abstand von Z.B 50m (für einen Km wären das ca 20 Punkte) anzulegen. Dann muss man der vorgegeben Strecke nachlaufen um der Zone zu folgen.

docfred
 

Charlenni

Geomaster
Hallo,

zufällig über Deine Frage gestolpert.

Ich habe das mal in einer Cartridge gemacht. Einfach eine große Zone, die den ganzenWeg enthält. Dort die Person, der gefolgt werden soll reinpacken. Dann im Author Script Bereich die Tabelle mit den Wegpunkten anlegen. In etwa so

Code:
tblBewegung = {}
table.insert(tblBewegung,Wherigo.ZonePoint(48.01,9.01,0))
table.insert(tblBewegung,Wherigo.ZonePoint(48.02,9.02,0))
table.insert(tblBewegung,Wherigo.ZonePoint(48.03,9.03,0))
table.insert(tblBewegung,Wherigo.ZonePoint(48.04,9.04,0))
table.insert(tblBewegung,Wherigo.ZonePoint(48.05,9.05,0))
varBewegungMax = # tblBewegung
varBewegungPos = 0

Dann einen Timer anlegen, der die Person bewegt. Dort bei jedem Tick dann die neue Position setzten.

Code:
varBewegungPos = varBewegungPos + 1
if varBewegungPos <= varBewegungMax then
  zcharacterPerson.ObjectLocation = tblBewegung[varBewegungPos]
end

Abstand des Spielers zur Person ist dann

Code:
varBewegungDist = zcharacterPerson.CurrentDistance:GetValue("m")

Sollte mit jedem Builder machbar sein.
 
OP
H

hmpfgnrrr

Geocacher
docfred schrieb:
Man könnte auch die Mittelpunkte der möglichen Zonenpositionen in einen table schreiben und beim Unterschreiten des Abstandes zur Zone/zum Mittelpunkt (nach der von bodenseepingu beschriebenen Methode) die Zone so verschieben, sodass der nächste Punkt neuer Mittelpunkt ist. Es würde dann reichen Zonenmittelpunkte im Abstand von Z.B 50m (für einen Km wären das ca 20 Punkte) anzulegen. Dann muss man der vorgegeben Strecke nachlaufen um der Zone zu folgen.

Das ist ja so in etwa genau das, was mir vorschwebt. Nur dass in dem Beispiel die Richtung der Verschiebung um 50 m zufällig ist, ich sie aber vorgeben möchte - und das entlang eines nicht-linearen Pfades.
Mich hat jetzt der Ehrgeiz des Perfektionisten gepackt. Ich versuche das mal umzusetzen. Da muss ich aber erst mal in die LUA-Dokumentation reinschauen.

Kleine Frage am Rande: in Urwigo muss eine Zone immer flächig sein, also aus mindestens drei Eckpunkten bestehen. Kann LUA auch mit echten Punktzonen umgehen?
 

Charlenni

Geomaster
Es ist keine Frage ob LUA das kann, es ist eine Frage, ob alle Player das können. Und das wage ich zu bezweifeln, habe es aber noch nie selbst ausprobiert.
 

docfred

Geocacher
Wenn du diese Zone nie betreten willst kann sie vielleicht sogar aus drei identischen Punkten bestehen. Ein einzelner Punkt ist m.E. zumindest vom builder her, nicht erlaubt.
docfred
 
OP
H

hmpfgnrrr

Geocacher
Ich hab gestern mal ein bisschen mit LUA herumprobiert, bin aber bereits an der einfachsten Aufgabe, eine Zone zu verschieben, gescheitert. Da man ja auch immer die Zone deaktivieren und wieder aktivieren muss, ist mir dabei aufgefallen, das man im Player dabei auch immer wieder aus dem entsprechenden Zonenunterpunkt rausgeschmissen wird, man also erst einmal nicht direkt sieht, wo es weitergeht. Und wenn dem Spieler sowas alle 20 m passiert, ist das ziemlich nervig und gefällt mir nicht.

Ich werde es wohl doch irgendwie mit Urwigo machen.
 

docfred

Geocacher
hmpfgnrrr schrieb:
Icbin aber bereits an der einfachsten Aufgabe, eine Zone zu verschieben, gescheitert. .
Das Verschieben einer Zone in Lua ist sicher nicht die einfachse Aufgabe bei der WIG Erzeugung.


hmpfgnrrr schrieb:
das man im Player dabei auch immer wieder aus dem entsprechenden Zonenunterpunkt rausgeschmissen wird...

Was heißt "rausschmeißen aus Zonenunterpunkt"? du läufst doch der Zone hinterher?

docfred
 
OP
H

hmpfgnrrr

Geocacher
docfred schrieb:
Was heißt "rausschmeißen aus Zonenunterpunkt"? du läufst doch der Zone hinterher?
Ich kenne es jetzt nur vom Oregon. Die Zonen werden im Menu "Positionen" aufgelistet. Dort steht aber nur die Entfernung und Himmelsrichtung. Wenn ich da eine Zone (also die zu verfolgende Zone) auswähle, bekomme ich neben den Details der Zone auch einen Richtungspfeil angezeigt. Wenn ich diese Zone aber jetzt deaktiviere, schmeißt das Oregon mich aus der Detailansicht raus und ich kriege wieder die Zonenübersicht. Und das jedesmal, wenn ich die Zone verschiebe.

Zumindest ich navigiere im WIG mit diesem Richtungspfeil. Und wenn das alle 20 m verschwindet, würde mich das ziemlich nerven.
 

docfred

Geocacher
hmpfgnrrr schrieb:
docfred schrieb:
Was heißt "rausschmeißen aus Zonenunterpunkt"? du läufst doch der Zone hinterher?
Ich kenne es jetzt nur vom Oregon. Die Zonen werden im Menu "Positionen" aufgelistet. Dort steht aber nur die Entfernung und Himmelsrichtung. Wenn ich da eine Zone (also die zu verfolgende Zone) auswähle, bekomme ich neben den Details der Zone auch einen Richtungspfeil angezeigt. Wenn ich diese Zone aber jetzt deaktiviere, schmeißt das Oregon mich aus der Detailansicht raus und ich kriege wieder die Zonenübersicht. Und das jedesmal, wenn ich die Zone verschiebe.

Zumindest ich navigiere im WIG mit diesem Richtungspfeil. Und wenn das alle 20 m verschwindet, würde mich das ziemlich nerven.

Ok. das ist natürlich klar, dass man aus der Detailansicht rausfliegt, wenn diese deaktiviert wird.

Man könnte sich einen Richtungsgeber/Entfernungsmesser auch aus einem Item machen. Entfernung könnte man als Text ausgeben. Für die Richtung müsste man (16) Graphiken erzeugen (Pfeil N, NNO, NO, NOO, O....) Das wäre mit einem Grafikprogramm schnell erledigt.
16 Media-Elemente anlegen.
Einen table erzeugen, der die 16 Medien enthält
richtung[1]= Medium_N
...
Die ermittelte Richtung in 1-16 ummrechnen und dem Item dann immer das Bild aus dem table zuweisen.

docfred
 

Charlenni

Geomaster
Also, Du möchtest, dass die Leute einen bestimmten Weg laufen. Das mag vielleicht über eine wandernde Zone funktionieren, ist doch aber ganz unlogisch. Da ist es doch viel besser, eine Person laufen zu lassen. Diese kannst Du im "You See" beobachten und siehst auf den meisten Playern auch Richtung und Entfernung (oder liege ich da falsch). Diese Person musst Du nun nur noch bewegen. Dazu hast Du mehrere Möglichkeiten:
1. Der Abstand der Punkte ist immer gleich und der Charakter wird in gleichen Zeitabständen vorwärtsgesetzt (Timer).
2. Der Charakter wird immer dann vorwärts gesetzt, wenn der Player einen bestimmten Abstand hat (Überprüfung im Timer und dann entsprechend Punkt verschieben)
3. Der Charakter wird fließend fortbewegt (Timer 1 s und Zwischenpunkte berechnen)
4. Der Charakter hält immer gleichen Abstand zum Player (Timer 1 s und entsprechenden Zielpunkt über Schnittpunkt Umkreis-Player und Gerade berechnen)
Der erste Punkt ist der einfachste und genau so zu machen, wie ich in meiner ersten Nachricht aufgezeigt habe. Dazu eine Tabelle mit allen Wegpunkten erstellen, Anzahl merken und mit Timer den Charakter verschieben. Du kannst alle 10 m einen Punkt setzten. Dann verwendest Du 10 s und schon hast Du eine Geschwindigkeit von 3600 m/h oder 3,6 km/h, was man gut schaft. Nun musst Du nur noch im Timer bei jedem Tick den nächsten Wert aus der Tabelle holen, Position des Charakters auf diese setzten, Zähler mit Tabellenende vergleichen und wenn gleich Timer stoppen, ansonsten um eins erhöhen. Ganz einfach. Der Spieler betrachtet nun immer den Charakter unter "You See" und folgt diesem. Springt zwar alle 10 s um 10 m, aber alles andere ist meines Erachtens zu aufwendig.
 
OP
H

hmpfgnrrr

Geocacher
@docfred
Oh je, das ist mir ein wenig zu kompliziert.

@Charlenni
Bislang dachte ich, dass eine Person immer an eine Zone gebunden ist, also in der kompletten Zone auftaucht. Daher konnte ich mit deinem ersten Beitrag recht wenig anfangen. Aber wenn man natürlich auch einer Person eine Koordinate zuweisen kann, dann ergeben sich daraus ganz andere Möglichkeiten (schließlich will ich die Person und nicht die Zone verfolgen).
Wie weise ich denn der Person in Urwigo eine Position zu? Da habe ich das Dropdown-Menü mit den Zonen und darunter ein Feld, um Koordinaten einzugeben. Die Koordinaten müssen dann in der entsprechenden Zone liegen?
 

Charlenni

Geomaster
Wie das in Urwigo geht kann ich Dir nicht sagen. Kenne ich nicht so gut ;-). Aber Du kannst das sicher direkt mit Lua Kommandos machen. Du kannst dort dem Eigenschaft "ObjectLocation" einen ZonePoint zuweißen. Dort ist dann der Character und der Spieler sieht Entfernung und Richtung. Damit man den Charakter auch sieht packst Du ihn in eine Zone, die den ganzen zu laufenden Weg umfasst. Und schon ist er immer sichtbar. Außer Du verläßt die Zone. Die Punkte legst Du wie schon früher angegeben im Author Script an. Einfach mein Beispiel reinkopieren und Variablennamen an Urwigo anpassen. Timer usw. machst Du auch in Urwigo.
 
OP
H

hmpfgnrrr

Geocacher
Ich hab mich am Wochenende mal hingesetzt und mal ein bisschen herumgebastelt. Dabei habe ich schließlich sogar eine recht einfache Funktion entwickeln können, mit der man eine Person im gleichbleibenden Abstand verfolgen kann.

Charlenni schrieb:
Dann im Author Script Bereich die Tabelle mit den Wegpunkten anlegen. In etwa so

Code:
tblBewegung = {}
table.insert(tblBewegung,Wherigo.ZonePoint(48.01,9.01,0))
table.insert(tblBewegung,Wherigo.ZonePoint(48.02,9.02,0))
table.insert(tblBewegung,Wherigo.ZonePoint(48.03,9.03,0))
table.insert(tblBewegung,Wherigo.ZonePoint(48.04,9.04,0))
table.insert(tblBewegung,Wherigo.ZonePoint(48.05,9.05,0))
varBewegungMax = # tblBewegung
varBewegungPos = 0
Gibt es einen Grund, warum du die Tabelle nicht einfach mit vorgegebenen Werten initialisierst, sondern die Werte erst nachträglich reinschreibst? varBewegungMax müsste man eigentlich eleganter über
Code:
varBewegungMax = table.getn(tblBewegung)
bekommen können.

Charlenni schrieb:
Dann einen Timer anlegen, der die Person bewegt. Dort bei jedem Tick dann die neue Position setzten.

Code:
varBewegungPos = varBewegungPos + 1
if varBewegungPos <= varBewegungMax then
  zcharacterPerson.ObjectLocation = tblBewegung[varBewegungPos]
end
Ich habe mir folgendes gebastelt:
Code:
function bewegen(person)
  if person.CurrentDistance:GetValue("m") < 50
    then person.ObjectLocation = tblBewegung[varBewegungPos]
    varBewegungPos = varBewegungPos +1
  end
end
Ist natürlich noch etwas rudimentär, insbesondere die Behandlung der if-Schleife, auch die Abbruchbedingung muss noch reingebastelt werden - aber es funktioniert! Auf diese Weise kann man sehr einfach eine Person im Abstand von 50 m verfolgen.
 

docfred

Geocacher
hmpfgnrrr schrieb:
Gibt es einen Grund, warum du die Tabelle nicht einfach mit vorgegebenen Werten initialisierst, sondern die Werte erst nachträglich reinschreibst?
Das ist Geschmacksache,
wenn du alle Punkte vorher schon weisst, kannst du die Wegpunkte auch einfach in geschwungener Klammer mit Komma getrennt anlegen.
Code:
tblBewegung = {Wherigo.ZonePoint(48.01,9.01,0), Wherigo.ZonePoint(48.02,9.02,0)....}
oder
Code:
tblBewegung = {}
tblBewegung[1] = Wherigo.ZonePoint(48.01,9.01,0)
tblBewegung[2] = Wherigo.ZonePoint(48.02,9.02,0)

hmpfgnrrr schrieb:
varBewegungMax müsste man eigentlich eleganter über
Code:
varBewegungMax = table.getn(tblBewegung)
bekommen können.

Leider funktioniert table.getn(...) nicht in allen Playern, deshalb ist die vorgeschlagene Version die richtige!

Sonst sieht das schon ganz gut aus. Allerdings sollte varBewegungPos nicht über die Anzahl der Punkte hinauslaufen können.

docfred
 
OP
H

hmpfgnrrr

Geocacher
docfred schrieb:
Leider funktioniert table.getn(...) nicht in allen Playern, deshalb ist die vorgeschlagene Version die richtige!
Gut zu wissen!

docfred schrieb:
Allerdings sollte varBewegungPos nicht über die Anzahl der Punkte hinauslaufen können.
Das ist mir klar und das habe ich mittlerweile auch eingefügt. Das einzige ist noch des Stoppen des 1-Sekunden-Intervall-Timers. Gibt es dafür einen Befehl, den man verwenden kann? Sowas wie
Code:
meinTimer:stop()
Das ganze ist leider nicht so besonders gut dokumentiert.

Ich habe es jetzt so gemacht, dass ich einen Schalter in die if-Bedingung mit rein genommen habe, der auf "1" gesetzt wird, wenn ich am Ende angekommen bin, und der jedesmal vom Timer abgefragt wird. Das funktioniert auch, anders wäre es aber eleganter.
 

docfred

Geocacher
Der Lua-Befehl lautet so, wie du es genannt hast, wobei "meintimer" der Name ist, den du bei der Kennnung/Identifier bei deinem timer in URWIGO eingetragen hast.
docfred
 
OP
H

hmpfgnrrr

Geocacher
docfred schrieb:
Es gibt in URWIGO einen drag&drop timer stop befehl
Das ist mir durchaus bewusst. So habe ich es dann ja auch gemacht.

docfred schrieb:
Der Lua-Befehl lautet so, wie du es genannt hast, wobei "meintimer" der Name ist, den du bei der Kennnung/Identifier bei deinem timer in URWIGO eingetragen hast.
docfred
Als ich es auf diese Weise probiert habe, ist der Simulator einfach abgestürzt. Kann aber auch sein, dass was anderes an dem Konstrukt nicht ganz korrekt war (und ja, den Identifier hatte ich gesetzt und verwendet).

Ist ja auch wurscht. Es funktioniert jetzt und ich kann es verwenden. Einen großen Dank für die Hilfe!
 

Charlenni

Geomaster
Habe irgendwie keine Benachrichtigung über die neuen Nachrichten bekommen. Seltsam. Bisher hat es ja auch geklappt.

Ich wollte nochmal kurz meinen Senf dazu geben. Docfred hat ja eigentlich alles wichtige schon erklärt.

Die Tabellen kann man initialisieren wie man will. Ich mache es einfach immer etwas umständlich, da ich dies besser zum Lesen finde. Natürlich kann ich alles in eine Zeile "wurschtln". Aber ob alle dann auch verstehen, was gemeint ist? Also lieber 5 Zeichen mehr und dafür auch später noch gut zu lesen.

Das mit dem # ist schon richtig. Wie Jan (Entwickler von OpenWIG und damit der Basis von WhereYouGo) immer richtig anmerkt, ist table.getn() seit der Lua-Version 5.1 abgekündigt und soll nicht mehr verwendet werden. Ich versuche mich daran zu halten. Macht weniger Ärger.

Bei 50 m Abstand kannst Du getrost den Timer auf einen höheren Wert als 1 Sekunde einstellen. Trotzdem wird der Folgende nicht über die Person stolpern, außer er wäre dieses Jahr im Endlauf der 100 m gestanden. Dann ist der Player weniger belastet.
 
Oben