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

Zuweisung von Zielen bei Objekten in Urwigo

Sabeta

Geocacher
Ich hätte gerne, dass der Befehl nicht beim Item angezeigt wird wo er definiert wurde, sondern nur bei den Verknüpften Items.

Item X -> abbrechen (Item A,Item B)

Soll ergeben:
Item X (nichts)
Item A -> abbrechen (Item X)
Item B -> abbrechen (Item X)

jetzt ist es ja so:
Item X -> abbrechen (Item A, Item B)
Item A (nichts)
Item B (nichts)

Ich bräuchte so ein Hilfskonstrukt um jederzeit auf den Hauptbildschirm zu kommen. Jetzt ist es so, dass ohne Aufruf des Hauptbildschirmes (was hier sinnvoll ist*) bei Mehrfach-Aktionen ( "gib" (Apfel, Birne, Keks, Axt)) der Item-Bildschirm im Hintergrund x-mal aktiv bleibt und der Spieler am Ende der Aktion x-mal (hier 4mal) auf zurück klicken muß um das Item zu verlassen um zum Menü zu kommen (dies ist beim WhereYouGo so, im Emulator ist es nicht notwendig, schein ein Bug zu sein). Ich möchte also hier das Item "abbrechen" mit (gib) verknüpfen so das gib (Apfel, Birne, Keks, Axt, abbrechen) das Resultat ist. Das funktioniert schon so, hat nur den unschönen Nebeneffekt, das das Item "abbrechen" hier jetzt mit (gib), (benutzen), (öffnen) usw. verknüpft ist, zwar passiert nichts, aber schön wäre, wenn nichts angezeigt wird.


* sinnvoll deshalb, weil sonst ein Spieler immer wieder aus den Hauptbildschirm heraus das Item aufrufen muß, so kann er gleich weiter machen und das nächste Item "geben".(ist einfach eine Sache des runden Spielablaufes). Wenn es keine Lösung gibt, muß ich es natürlich so machen. :(
 

Charlenni

Geomaster
Ah, jetzt ist es klar.

Einfach das Commando "Abbrechen" bei jedem Item einfügen, MakeReciprocal=false und entsprechend aktivieren, wenn gewünscht. Oder einfach den Spieler etwas mehr klicken lassen. Oder WhereYouGo anpassen (ist ja Open Source). Oder warten, bis der nächste Android Player rauskommt.

PS: Die "Oders" sind nicht so ernst gemeint :D
 

Sabeta

Geocacher
ja wenn es sooo einfach wäre :D

Die Idee hatte ich auch schon - zumindest sehr kurz - bis mir klar wurde, geht nicht. :)
Grund: der "Abbrechen"-Button erscheint dann separat bei jeden Item und nicht in der Liste der möglichen Items die mit einen Befehl (gib) z.B. verknüpft sind. Natürlich könnte man so einen separaten Button machen, aber man kommt ja auch nicht aus der Liste heraus, zudem hat der Button einen weiteren Vorteil, man sieht auch dann eine Auswahl, wenn nur eine Aktion möglich ist, das erläutere ich mal kurz (WheroYouGo bug/feature?):

Mutter (gib) und Apfel sind verknüpft und man kann im Fall A der Mutter den Apfel geben [Mutter (gib) Apfel] oder umgekehrt im Fall B den Apfel der Mutter geben [Apfel (gib) Mutter].

Beim WhereYouGo wird im Fall A Mutter (gib) der Apfel zur Auswahl gestellt, klickt man drauf wird die Aktion ausgeführt. Korrekt!

Im Fall B wird nach Apfel (gib) die Mutter nicht zur Auswahl gestellt, sondern direkt der Mutter gegeben. Nicht Korrekt, da der Spiel zum Zeitpunkt seines Klicks nur (gib) liest und gar nicht wissen kann wem er in diesen Falle den Apfel (hier die Mutter) geben wird. Gibt es nun "Abbrechen" und Mutter (gib) ist mit Apfel und Abbrechen verknüpft erscheint die Auswahl, also Apfel (gib) -> Mutter, Abbrechen. Hier sieht also der Spieler wemm er den Apfel gibt und kann zudem auch bequem abbrechen.

jetzt sind sicher alle Klarheiten beseitigt :)

Sabeta
 

Charlenni

Geomaster
Ah, in diesem Fall sicher ein Feature. WhereYouGo möchte in diesem Fall dem Spieler die Arbeit abnehmen, die es erfordert, die logische, da einzige, Lösung, zu bestätigen.

Vielleicht solltest Du das Commando "Niemandem" nennen. Liest sich besser als "Abbrechen". Oder Du stellst einfach einen zweiten Empfänger in die Zone, der den Apfel auch verwerten kann. Z.B. "gefräßiges Schwein". Das Taucht immer dann auf, wenn Du den Apfel jemandem geben möchtest. Ansonsten ist es unsichtbar. Natürlich mag dieses auch alle anderen Dinge. Da das Schwein nicht sichtbar ist, kannst Du es auch nicht aufrufen.
 

Sabeta

Geocacher
Die Idee mit dem Schwein ist nicht schlecht. Mit dem nicht sichtbaren Item war schon eine Gedanke von mir, nur bekommt man diesen nicht nichtbar gemacht - das ginge nur über das verbotene Click-Event.
 

PapaGei139

Geocacher
Sabeta: okay, jetzt funktioniert es (auch mit Verschlüsslung) - wenn auch nicht so wie erhofft* als benutzterdefiniertes LUA

Code:
abbrechen.Commands.abbrechen.MakeReciprocal = false

Kannst Du mal nen Screenshot machen wo Du den Befehl im Quelltext einsetzt?
Nur zum Verständnis: Ich öffne die .urwigo Datei mit dem Editor und setzte den Befehl (in meinem Fall dieser hier:
Code:
Schere.Commands.benutze.MakeReciprocal = false
in Urwigo bei Lua Benutzer Funktionen ein.
Da es dann im Quelltext ans Ende geschrieben wird,
(was so aussieht):
Code:
<UserFunktions>
<System:String>Schere.Commands.benutze.MakeReciprocal = false</System:String>
<UserFunktions>
aber der Befehl ja vor dem "true" kommen soll, kopierte ich den generierten Befehl nun vor den Teil der mir sinnvoll erschien.

Das sah dann so aus:
Code:
<UserFunktions>
<System:String>Schere.Commands.benutze.MakeReciprocal = false</System:String>
<UserFunktions>
<Name>
<System:String>Schere</System:String>
</Name>

Trotzdem erscheint weiterhin der Befehl "benutze" bei dem Seil (welches bei der Schere unter "Zielobjekt" -->"Bestimmte Objekte" verknüpft ist.

:???:
Hey, aber es kommt immerhin keine Fehlermeldung mehr. Das ist doch schon mal prima! :D
 

Sabeta

Geocacher
Screenshot
http://www.directupload.net/file/d/3511/n9v5jdns_jpg.htm

Warum kann man eigentlich keine Bilder als Anhang hochladen? :motz:
 

PapaGei139

Geocacher
Vielen Dank schon einmal für die Hilfe.
Die Zuweisung hab ich nun hinbekommen und es funktioniert auch sehr zuverlässig. Toll!
Doch wenn der "Stein" oder die "Schere" nicht verfügbar sind, wieder reagieren die Player unterschiedlich.
Ich teste z.Z. mit iPhone/Wherigo und HTC/WhereYouGo.

Ich habe in Urwigo auch einen Alternativtext angegeben, wenn kein Item verfügbar ist.
Doch den nimmt zwar das iPhone, doch das Android nicht.

Eigentlich würde ich auch lieber als Antwort eine Zufallsentscheidung mit verschiedenen Meldungen einbauen. Nur weiß ich nicht, ob das überhaupt geht.
Die Meldung, die ich im wenn/sonst Block rechts steht, geht natürlich nicht - dessen bin ich mir bewusst - schön wäre es aber dennoch.
Der Alternativtext "Ich sehe hier nichts..." ist ja nicht durch irgendeine Lua-Funktion zu ersetzen.

Oder kennt hier vielleicht doch einer eine Lösung?

Gruß, Leto

Urwigo.png

WhereYouGo-Android.JPG

iPhone.JPG
 

Charlenni

Geomaster
Dieser leere Text kann als Attribut mit dem Namen "EmptyTargetListText" beim jeweiligen Commando gesetzt werden. Sollte bei Dir dann
Code:
Schere.benutze.EmptyTargetListText
sein.

Der fehlende Text bei Android kann vermutlich nicht gesetzt werden. Hat der Programmierer wohl wegrationalisiert :roll: .
 

PapaGei139

Geocacher
Das heißt, eine Zufallsereignis mit verschiedenen Meldungen wäre ja dann ausgeschlossen.
Ich meine, wenn weder Stein noch Seil da ist, sagt er beim "benutze Schere mit" mal "Autsch" oder "das mach ich nicht" oder "sonst irgendwas".

Es geht also nur dieser eine Text den ich bei "Leerer Text" eingeben kann. (Der ja wie oben gezeigt) bei Android wegrationalisiert ist. Versteh ich das richtig?
 

Charlenni

Geomaster
Du kannst natürlich den Wert immer wieder ändern. Das ist ja kein Problem in Lua. Allerdings bin ich nicht sicher, ob es möglich ist, dort auch eine Funktion zu hinterlegen. Ich denke aber nicht.
 

Sabeta

Geocacher
Der Text lässt sich natürlich ändern, nur leider nicht zum Zeitpunkt wenn er angezeigt wird. Ist ein Ziel vorhanden, kann man entsprechend zielbasierend reagieren, aber dann ist der Text nicht notwendig.

Sabeta
 

PapaGei139

Geocacher
Guten Morgen,

leider bin ich mit Lua nicht so vertraut, sonst müsste ich hier nicht so viel fragen.
Ich muss aber sagen, dass ich dieses Forum echt prima finde. Dadurch hab ich schon viel dazugelernt.

Leider funktioniert es nicht, was ich gebastelt habe.
Mit welchem Lua-Code bekomme ich das "Problem" mit der Zuweisung von zufälligem Textmeldungen bei nicht verfügbaren Items mit Urwigo gelöst?
siehe verlinktes Bild
Urwigoscreen.JPG
 

Sabeta

Geocacher
Wie ich schon schrieb, es ist nicht möglich. leider, ich würde das selbst auch gerne anpassen. :(

Der Text wird nur dann angezeigt wenn es kein Ziel gibt, die "Routine" in der du aber den Text anpassen möchtest, wird nur aufgerufen wenn es mindestens ein Ziel gibt.

Du müsstest also einen Schritt voran schon reagieren und wenn dies überhaupt geht, dann nur in LUA, ich denke aber eher das es nicht möglich ist, da es eine Funktionalität der Wherigo-Bibliothek ist. Man bräuchte quasi ein Event "Kein Ziel" und müsste dann einen eigenen Event-Handler schreiben.

Mir ist aber kein Event derart bekannt.Das einzige verfügbare Event bei Gegenständen ist onClick und das sollte man nicht verwenden.

Wenn man onClick ohne Problem verwenden könnte, könnte man darüber den Text durch eigenständigen Prüfen, ob Ziele vorhanden sind, anpassen, weil dieses Event vor dem Click auf dem Befehl ausgeführt wird.


Sabeta
 

Charlenni

Geomaster
Ist doch schon fast alles richtig. Nur mußt Du im oberen roten Kasten natürlich auch noch einen Text zuweisen. Also
Code:
Schere.benutze.EmptyTargetListText="blablabla"
Ansosnten ist er natürlich leer. Und funktionieren tut es nur zur Laufzeit. Ist klar, oder?

Wichtig ist, dass Du Dir klar wirst, dass die Anzeige des Textes nichts ist, was Du direkt beeinflussen kannst. Der Text wird einfach vom Player aus angezeigt. Dazu gibt es also kein Ereignis und nichts, wo man eine MessageBox auf den Schirm werfen kann. Damit wird es dann schwierig, wo Du den Text ändern möchtest. Da fällt mir spontan auch nichts ein außer einem Timer.
 

satanklaus

Geomaster
Charlenni schrieb:
Ich würde es mal mit
Code:
objGeld.Commands["Geben"].MakeReciprocal = false
versuchen. Höchstens Du hast das Commando mit einem Namen versehen, der "cmdGeben" lautet. Ansonsten sollte es funktionieren. Wengistens auf Garmin Playern.

Eventuell noch darauf achten, dass der Befehl vor einem "Enabled" ausgeführt wird. Dort wird nämliche der Wert abgeprüft und das reziproke Commando bei Bedarf erstellt.


Ein Jahr später ist doch ein prima Zeitpunkt nochmal nachzuhaken :D
Hier wird ja mehrfach berichtet, dass das funktioniert.
Tut es bei mir aber leider nicht.
Ich habe den Code in den OnStart-Handler gepackt, der Interpreter meckert nicht, ich sehe am Debug-Output im Emulator, dass er ausgeführt wird. Scheint aber nichts zu bewirken: die Verknüpfung besteht weiterhin bidirektional. :???:

Tipps?

(Noch ein kleiner Urwigo-Demonstrator im Anhang.)
 

Anhänge

  • reciprocal-test.zip
    2 KB · Aufrufe: 16

jonny65

Geomaster
2 Fehler ... etwas auskommentiertes wird natürlich nicht verarbeitet :D

Und bei der Flasche fehlt das Objekt "Commands"

Also vorher :
Code:
-- Flasche.Geben.MakeReciprocal = false

Nachher :
Code:
Flasche.Commands.Geben.MakeReciprocal = false
 

satanklaus

Geomaster
jonny65 schrieb:
2 Fehler ... etwas auskommentiertes wird natürlich nicht verarbeitet :D

Das ist klar, der aktive Code stand im OnStart-Handler der Cartridge.

Aber ich habe jetzt meinen Denkfehler erkannt:
Bisher war ich der Meinung, dass der User fuctions View lediglich als Container für alle möglichen Funktionen dient, die dann noch von irgendwo aufgerufen werden müssen, um abgearbeitet zu werden.
Es scheint aber zusätzlich so zu sein, dass alles, was nicht in einer function gekapselt ist, als globaler Code ausgeführt wird (Wann?).
Ich bin also nicht auf die Idee gekommen, dass ich die Codezeile einfach so ohne function dort reinschmeißen kann. Ich habe da nur den Code editiert, weil der Bereich größer ist als der im Lua User Code Element von Urwigo. Anschließend hab ich es dann rüberkopiert und auskommentiert.

Nun habe ich jedenfalls die endgültige Form des Befehles wieder in die User Functions kopiert und siehe da - funktioniert. Jetzt würde ich nur noch gerne verstehen, warum es so rum geht, der gleiche Code im OnStart Handler der Cartridge aber keinen Effekt hat.

Danke - mal wieder - jonny65
 

Charlenni

Geomaster
Der komplette Lua Code wird beim Laden der Cartridge ausgeführt. Zu diesem Zeitpunkt werden die Zonen und Gegenstände erzeugt. Alle Funktionen werden in der Lua Umgebung definiert, so dass sie später aufgerufen werden können. Am Ende übergibt der Code das erzeugte Cartridgeobjekt mit einem return an den Player. Dieser kann dann einzelne Funktionen aufrufen, was er z.B. beim Start macht. Dort wird dann nämlich die Funktion OnStart des Cartridgeobjektes aufgerufen.

Beim Start der Cartridge (nachdem diese geladen ist), passiert nun folgendes: der Player erstellt alle Commands und die dazugehörigen ReciprocalCommands. Diese können später nicht mehr verändert werden, also auch nicht mehr im OnStart Ereignis, das nach dem Start der Cartridge aufgerufen wird.

Aus dem oben gesagten folgt dann, dass man MakeReciprocal während des Ladens setzen kann, aber nicht während des Startens oder später. Deshalb funktioniert es in den Lua Benutzer Funktionen außerhalb einer Funktion, aber nicht in OnStart.

Ich hoffe, ich konnte es verständlich erklären :D
 
Oben