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

Zonen per LUA aktivieren und deaktivieren

OP
austriaka

austriaka

Geocacher
Ich denke, es liegt daran, dass du zum Aktivieren der Zone eine eigene Funktion hast, mit der du die Zone praktisch neu konstruierst (???), während ich ganz einfach myZone.Active = true gesetzt habe.

Kannst du mir diesen Teil erklären?
Code:
-- nun die Zone berechnen
           zone.Active = false
           local dist0 = Wherigo.Distance(0, 'm')
           zone.OriginalPoint = Wherigo.TranslatePoint(var_locationstbl[index], dist0, 0)
           zone.Points = var_pointstbl[index]
           zone.Active = true

Du deaktivierst die Zone, verschiebst den OriginalPoint um 0 Meter, definierst die Punkte wie gehabt und setzt das Flag Active auf true.
Was macht das für einen Sinn? (Außer dass es funktioniert ;))
 

bodenseepingu

Geomaster
es macht keinen Sinn - man lernt im Laufe der Zeit auch dazu - war wahrscheinlich im Originalkontext mal eine Projektion - heute würde ich das ersetzen mit
zone.OriginalPoint = var_locationstbl[index]

aber das ist es sicher nicht...ich weiss es einfach nicht - kleinere Schwankungen sind wahrscheinlich normal - aber im Emulator muss dein Konstrukt gehen und draußen dann eigentlich auch...vielleicht hast irgendwo einen Schreibfehler ???

Wie gesagt - da ich die Zonen verschiebe (ich konstruiere sie nicht neu), deaktiviere ich sie einfach und setze sowohl OriginalPoint als auch Points.

Du hast ja offensichtlich jede Zone definiert - dann deaktiviere diejenigen, die weiter weg liegen und aktiviere die 3 nächstgelegenen. Im Zweifelsfall würde ich halt eine bereits aktive Zone nicht extra nochmals aktivieren - aber auch das sollte nix ausmachen.
 
OP
austriaka

austriaka

Geocacher
ich war mit der Cartridge noch gar nie draußen, das ganze spielt sich im Emulator ab, das ist ja das komische... Bei jedem Schleifendurchlauf wandern die Zonen um ca. 1,5 Meter

Ja, ich habe die Zonen alle angelegt. Alle sind zu Anfang nicht aktiv und nicht sichtbar.
Meine Funktion berechnet die Distanz zwischen Player und OriginalPoint der Zone, die Zuweisung zu nächste, zweitnächste und drittnächste erfolgt wie bei deinem Beispiel.
Diese drei Zonen werden dann per myZone.Active = true aktiviert.
Lasse ich das Zone.Active weg, ist die Distanz bei jedem Durchlauf gleich.
Aktiviere ich die drei Zonen, wandern sie bei jedem Durchlauf, bis zu einem Punkt wo die drei nächsten nicht mehr am nächsten liegen.
Nochmal: das ganze ist im Emulator und der Player bewegt sich nicht. Die jeweiligen Points ändern sich auch nicht, nur die Distanz.

Hier der Code, aufs einfachste eingedampft:
Code:
function print_dist()
	myZone.Active = false
	myPoint = myZone.OriginalPoint
	standort = Player.ObjectLocation
	d,b = Wherigo.VectorToPoint(standort, myPoint)
	dist = d:GetValue 'm'
	myZone.Active = true
	print(dist)
end

Definiere eine Zone und nenn sie myZone, mache einen 3-Sekunden-Timer, der print_dist() aufruft und starte den beim Start der Cartridge. Setze dein Männchen daneben und schau im Debugger zu, was passiert...
Wenn du myZone.Active = false weglässt, ändert sich die Distanz übrigens nicht.
Any Ideas?
 

bodenseepingu

Geomaster
hmmm - hab ich so noch nie bemerkt - aber auch noch nie drauf geachtet - vielleicht driftet das Männchen - hat einen kleinen Maus-Impuls und du hast es nicht bemerkt, weil du nicht hinreichend reingezoomt hast...Emulator-Fehler?
 
OP
austriaka

austriaka

Geocacher
wenn ich mir die Points ausgeben lasse, sind die unverändert. Ich tippe auch auf einen Emulator-Fehler, anders kann ich es mir nicht erklären
 
OP
austriaka

austriaka

Geocacher
habe das mal eben auf dem Oregon im Garten ausprobiert, hier scheint das Wandern der Zonen nicht stattzufinden
LG
Karin
 
austriaka schrieb:
points_tbl {} hält für jede Zone einen Punkt zu dem ich den Abstand berechne
zones_tbl {} sind die Zonen

Hallo,

kann mir bitte jemand auf die Sprünge helfen? Ich habe in der Cartridge fest erstellte Zonen und versuche die Zonenpunkte und die Zonen in die Tabelle zu bekommen.

Mit objMeineZone.OriginalPoint bekomme ich einen Compiler-Fehler, und bei allen anderen Versuchen erhalte ich einen Laufzeitfehler: attemped to index filed '?' (a nil value)

Müsste ich nicht mit einer For Schleife alle Punkte je Zone einlesen? Und wie sähe der Sourcecode dazu aus?


Udo
 
OP
austriaka

austriaka

Geocacher
Du brauchst die Punkte nicht in eine Tabelle zu legen, das ist doch alles schon vorhanden.
Den Originalpunkt sprichst du an mit Zonenname.OriginalPoint. Wenn du dabei einen Compiler-Fehler bekommst, dann verwendest du den Punkt in einem falschen Kontext. Ich glaube, der ist eine Objektinstanz, die du nur in einer Funktion wie VectorToPoint() verwenden kannst. Wenn du print(Zonenname.OriginalPoint) ausgibst, dann bekommst du sowas wie ZonePoint(51.5059968432257, 6.54931375086308, 0)

Ich habe erst eine Table mit festen Punkten gehabt, zu denen ich den Abstand berechnete. Jetzt spare ich mir diese und verwende gleich den OriginalPoint. Nachdem ich die Zonen nicht verschiebe, klappt das wunderbar.

Ich habe nur noch einen Tabelle mit den Zonen, um sie aus dem Programmablauf heraus anzusprechen, die sieht so aus:
Code:
zones_tbl = {}
zones_tbl.zone1 = myZone1
zones_tbl.zone2 = myZone2
zones_tbl.zone3 = myZone3
...
wobei myZone die (selbst vergebene) ID meiner Zone ist.
Achtung: keine Anführungszeichen rund um den Namen der Zone! Du hast hier wirklich das Objekt Zone in deiner Table und nicht nur den Namen.
Und ich würde dir raten, die ID der Zone bzw. aller Dinge, die du per LUA ansprechen willst, selbst zu vergeben. Ich hatte am Anfang massive Schwierigkeiten, die Namen meiner IDs rauszufinden, weil ich ohne Nachzudenken Items und Zonen gleich benannt hatte. Die Zone hatte dann die ID objZonenname1... Deshalb verwende ich für sowas nur noch selbstgebastelte Namen

Die Zonenpunkte sind übrigens einfach nur ein Table:
Code:
MyZone.Points = {
	ZonePoint(51.5062106363056, 6.55258269309998, 0), 
	ZonePoint(...), 
	...
}

HTH
Karin
 
Oben