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

Bilder in Abhängigkeit von Variablenwert anzeigen

kansu_makugen

Geocacher
Tach,

ich hab mal wieder 'ne Frage. Ich kann ja ein Bild, z.B. das einer MsgBox oder InputBox, über 'nen Lua-Befehl ändern. Hab sowas auch mal durchpraktiziert. Ich hab also der MsgBox ein Bild zugewiesen (nennen wir es mal objBild). Der Spieler macht dann ein paar Eingaben, woraufhin eine Variable einen bestimmten Wert erhält. Anschließend kommt eine etwas längere If-then Geschichte, z.B.:
If objVariable = 1 then
objBild = objBild1
elseif objVariable = 2 then
objBild = objBild2
...
usw.
Wenn ich aber viele verschieden Werte habe, wird das ganze sehr lang und unübersichtlich. Gibt es da vielleicht die Möglichkeit aus dem Variablenwert den entsprechenden Bildnamen zu generieren? Der Anfang von Bildnamen ist ja immer objBild, gefolgt von einer Zahl. Ich hatte mal sowas in der Art versucht:
objBild = "objBild" .. objVariable
aber dann wird ja aus dem Bildobjekt ein Stringobjekt. Läuft also nicht.
Wenn jemand 'ne Idee hat oder sowas vielleicht schonmal selbst gemacht hat, wäre ich wahnsinnig dankbar, wenn ihr euer Wissen mit mir teilt. :)

Grüße
 

xxmurdockxx

Geomaster
Das müsste doch eigentlich mit folgendem Code Funktionieren:
Code:
Wherigo.MessageBox{Text="Bild", Media=images[objvariable]}
Wenn die Bilder immer gleich beginnen und nur durch die nummer unterscheiden.

oder täusche ich mich?
 
OP
kansu_makugen

kansu_makugen

Geocacher
Hatte ich auch gedacht, aber wenn ich den konstanten Präfix hernehme, also z. B. "objBild", und da eine Zahl (meinetwegen 25) anhänge, dann habe ich eine String-Variable (Text) mit dem Wert "objBild25" und nicht die Objekt-Variable objBild25. Und wenn ich das dann in

Wherigo.MessageBox{Text="Bild", Media=images[objBild25]}

eintrage, weise ich der MsgBox ja kein Bild, sondern einen Text zu. Zumindest hatte ich bei meinen Testöäufen kein Bild in der MsgBox, aber auch keinen Absturz. Knifflig, die Sache...
 

xxmurdockxx

Geomaster
versuch mal dies:
Code:
function show_bild()
   
   local bild = {pic1, pic2, pic3, pic4, pic5, pic6, pic7, pic8, pic9, pic10}
   
   Wherigo.MessageBox{Text="Bild", Media=bild[varpic]}
   end

Hab mal die urwigo-Datei mit angehängt.
Funktioniert im Emulator tadellos.

Nachtrag... PIGO beim IPhone klappt auch ;)
 

Anhänge

  • bildertest.zip
    69,7 KB · Aufrufe: 33

goetzman

Geocacher
Hallo auch,

also ich habe zwar noch keinen eigenen Wherigo programmiert, bin aber drüber,
und nachdem Keiner der vorhandenen Builder wirklich prickelnd ist,
habe ich mir schon überlegt eine eigene "Wherigo-Sprache" zu entwickeln,
die dann in Lua übersetzt wird.
Aufgrund dieser Lua-Basteleien fallen mir hier drei Möglichkeiten ein,
ausprobieren mußt Du sie aber selber.
Ich verwende mal Variablennamen etc. aus der source vom ZooventurePenguinEscape

1) Direkt ein anderes jpg den Media-Resourcen zuweisen, setzt aber voraus, Du kriegst die jpg's auch in das gwc rein
zmediaSnowyOwl.Resources = {
{ Type = "jpg", Filename = "snowyowl_ppc.jpg", Directives = {},},
{ Type = "jpg", Filename = "snowyowl_garmin.jpg", Directives = {},},
}
Der Filename ist ein String, den Du beliebig zusammensetzen kannst.

2) Du legst ganz normal Medien an und weißt sie dann einem array zu
also z.B.
imagearray={}
imagearray[0]=zmediaSnowyOwl_MSG
imagearray[1]=zmediaZebra_MSG
idx=<Deine Formel>
Wherigo.MessageBox{Text=[["What are you waiting for? Go wake Brown Bear!"]],Media=imagearray[idx],}

3) Eine ganz üble Methode
Es gibt in lua ein Konstrukt namens loadstring, damit kannst Du lua source code direkt im Programm ausführen lassen.
Damit kannst Du alles zusammenbauen, was Du willst, aber auch beliebig viele Fehler produzieren, also ich würds nur im extremen Notfall tun.
Ich habe auch keine Ahnung, ob das die verschiedenen Wherigo-Player überhaupt unterstützen,
ich habs nur mal mir der Commandline-Version von Lua unter Windows probiert.
Ich führ das hier jetzt nicht weiter aus, aber beschrieben ist es hier: http://www.lua.org/pil/8.html

Ich hoffe da ist was Brauchbares dabei.
Grüße
 
OP
kansu_makugen

kansu_makugen

Geocacher
Super! Auf 'nen Array wäre ich mal wieder nicht gekommen. Danke euch! Werd's heute abend mal durchprobieren.
 

bodenseepingu

Geomaster
Ich habe ja ähnliche Problemstellungen auch schon gehabt.

Da bei WIG-Cartridges mit Ressourcen auch schonend umgegangen werden sollte (Anmerkung: ich habe beim Geo-Memory mit Media-Dateien Probleme bekommen, weil ich die Medien-Dateien in Tables hin- und hergeschoben habe), habe ich mich dann entschlossen mit Strings zu arbeiten - geht natürlich auch mit Zahlen.

Das sieht dann folgendermaßen aus:

In Urwigo einfach alle Medien anlegen - z.b. Bild1, Bild2, Bild3
In Urwigo ein Media aktBild anlegen
In den Benutzerdefinierten Funktionen eine LUA-Funktion schreiben

function get_media(nr)

if (nr == 1) then
return objBild1
elseif (nr ==2) then
return objBild2
....

end


In Urwigo eine Variable bildnr anlegen, diese sollte dann immer die Nummer des Bildes erhalten.

In Urwigo an den entsprechenden Stellen bevor das Bild verwendet wird folgendes Konstrukt verwenden

Festlegen...aktBild = (benutzerdefinierter Ausdruck) get_media(objbildnr)
 
OP
kansu_makugen

kansu_makugen

Geocacher
dieses lange if-then-else gefuddel wollte ich ja umgehen, von daher probier ich wie gesagt die array-methode mal aus.
Und dass du einen ähnlichen thread eröffnet hast, hab ich mal wieder zu spät gespannt. Man möge mir verzeihen. Ich bin doch noch so klein. ;)
 

bodenseepingu

Geomaster
...stimmt, die Frage in diesem Thread war ja, die If's vermeiden zu können...sry hatte ich nicht mehr in Erinnerung.

...wie gesagt, bei 36 Memory-Karten, die in Tables gesteckt haben, habe ich unter Garmin ominöse Absturze gehabt und habe deshalb statt der 36 Media-Objekte 36 Strings reingesteckt....seitdem ist die Cartridge zumindest deutlich stabiler....

...ist halt ein Unterschied, ob man 36 x 4kByte in Tables steckt oder 36 x 20 Byte...
...zumal das ganze halt doch in einem embedded device mit beschränkten Ressourcen läuft. Klar - das Problem ergab sich vielleicht daraus, dass ich die Media-Dateien in Urwigo angelegt hatte und dass ich sie zur Initialisierung dann halt nochmals in Tables
gesteckt habe -d.h. die Daten wurden doppelt gehalten. Wenn man die Media-Objekte komplett in LUA definiert, dürfte es keine Rolle spielen.

...aber wer weiß schon, was die Garmin-Player für ne Tagesform haben...oder was ich denn sonst noch nicht optimal gemacht habe....
 
OP
kansu_makugen

kansu_makugen

Geocacher
bodenseepingu schrieb:
...wie gesagt, bei 36 Memory-Karten, die in Tables gesteckt haben, habe ich unter Garmin ominöse Absturze gehabt und habe deshalb statt der 36 Media-Objekte 36 Strings reingesteckt....seitdem ist die Cartridge zumindest deutlich stabiler....
Na dann bin ich mal gespannt, wie meine cartridge auf einem GArmin läuft. Ich bin bei dem einen Rätsel, wo ich die Bilderwechselgschichte brauche schon bei 128(!) Bildern. Ich ahne ja schon schlimmes...
bodenseepingu schrieb:
...zumal das ganze halt doch in einem embedded device mit beschränkten Ressourcen läuft. Klar - das Problem ergab sich vielleicht daraus, dass ich die Media-Dateien in Urwigo angelegt hatte und dass ich sie zur Initialisierung dann halt nochmals in Tables
gesteckt habe -d.h. die Daten wurden doppelt gehalten. Wenn man die Media-Objekte komplett in LUA definiert, dürfte es keine Rolle spielen.
Wenn das ohne weiteres funktioniert, kann man die Bilder sicherlich auch so einbinden, aber muss man da nicht den genauen Pfad- und Dateinamen angeben? Ersterer wäre ja abhängig vom Gerät.
 

bodenseepingu

Geomaster
Ich würde folgendes machen:

  • eine Testcartridge mit ein paar Bildern anlegen mit Urwigo.
  • ein gwz erzeugen
  • gwz mit Zip auspacken
  • _cartridge.lua anschauen
  • sich an diesem code orientieren für die Bildergeschichte in einer table
  • achte drauf, dass bei der Bildermenge die Bilder nicht allzugross sind

aber vielleicht hat ja jemand anderer Erfahrung mit der großen anzahl an Bildern - wie gesagt weiss man immer nie, warum ein Garmin Probleme macht, dann ändert man was und dann gehts plötzlich...

Und Nein - Pfadangabe ist absolut kein Thema, da die Bilder in die Cartridge reinkompiliert werden
 
OP
kansu_makugen

kansu_makugen

Geocacher
Hab gestern mal die Sache mit dem array (bzw. habe ich einen "array of arrays") getestet und es lief, zumindest im Emu und anuf dem Phone mit OpenWIG. Müsste mir nur mal ein Garmin organisieren und schaun, ob's da auch geht.
 

Krolock

Geocacher
bodenseepingu schrieb:
...ist halt ein Unterschied, ob man 36 x 4kByte in Tables steckt oder 36 x 20 Byte...
Aber wenn du die Medien in die Tabelle steckst, wird nicht das Medium an sich kopiert (also nicht der value), sondern lediglich die Referenz auf das Medium. Es sollte also lediglich den Speicher verbrauchen ,den du für die Reference brauchst.

Auszug aus http://www.lua.org/manual/5.1/manual.html#2.2
Code:
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them.

Wenn du ganz sicher gehen willst, legst du eine Variable an, die wiederum auf das Medium verweist
 

bodenseepingu

Geomaster
Für dieses Thema gibt es Hoffnung - ich hab gerade mal experimentiert und eine Beispielcartridge angelegt.

Als eines der Attribute einer Cartridge enthält AllZObjects eine table mit allen anderen Objekten (Medien, Zonen, Charaktere, Items..)

Unter http://www.das-wherigo-handbuch.de/...Objekte_einer_LUA-Datei_ausgeben_/_bearbeiten hab ich eine Beispielcartridge - im Emulator kann man problemlos
durch alle Objekte durchloopen und sich z.b. den Namen ausgeben lassen.

Also kann man sich auch wenn ein media-Name über Variablen gebildet wird, das richtige Objekt raussuchen
 
Oben