Dinge, die vermieden werden müssen, da sie zu Fehlfunktionen bzw. zu Abstürzen führen

Aus Das Wherigo-Handbuch
Wechseln zu: Navigation, Suche

Wegen Programmierfehlern in den einzelnen WIG-Playern, dürfen verschieden Programmkonstrukte nicht verwendet werden. Dies kann sowohl die Programmierung mit den Buildern, als auch die Programmierung in LUA betreffen.

Dinge die unbedingt vermieden werden müssen, damit eine Cartridge auf allen Gerätetypen lauffähig ist

Will man eine für alle Geräte funktionsfähige Cartridge erstellen, so muss man die Aktionen ausschließen, die bei mindestens 1 Gerätetyp zu Problemen führen (können).

  • Vermeide OnClick-Events bei Items, Charaktern, Tasks und Zonen. Das onclicked Event bei Message Boxen kann man hingegen uneingeschränkt belegen. OnClick-Ereignisse führen bei Garmin-Geräten dazu, daß das Ereignis, das hinter dem OnClick Event steht, nicht ausgeführt wird.
  • Vermeide Commands bei Zones und Tasks. Bei Garmin-Geräten werden die Command-Schaltflächen nur bei Characters und Items angezeigt
  • Vermeide das Urwigo Kommando Save and close game. Einige Player speichern bei diesem Kommando die Cartridge NICHT. Verwende stattdessen den einfache Save game Befehl. Das Beenden der Cartridge aus dem Spiel heraus funktioniert bei allen Playern nicht.
  • Vermeide mehr als 6 Commands für ein Item oder Charakter. Der iPhone Player liefert bei Items und Charaktern, die mit mehr 6 Commands bestückt sind, sporadisch vertauschte Werte zurück ! Der Workaround besteht sinngemäß darin, maximal 6 Commands pro Element zu verwenden.
  • Vermeide Messages über 850 (inkl. Cariage Return !) Zeichen Länge, sie können leicht zum Absturz führen. Teile längere Texte deswegen auf, entweder in geschachtelte Messages oder in einen mehrseitigen Dialog.
  • Verwende Show Screen nur für Mainscreen - nicht z.B. für Task- oder Zonenbereich (Das ist der Screen, wo die Character, Gegenstände, Zonen als Liste angezeigt werden). Das führt auf Garmin-Geräten zum Absturz. ShowObjectDetails (zum Zeigen der Seite einer bestimmten Zone, Character, Item, Task) hingegeben funktioniert problemlos.
  • Vermeide mehr als 7 AKTIVE Zonen. Generell ist es am besten, nur die absolut notwendigen Zonen aktiv zu setzen und diese inaktiv schalten, sobald sie nicht mehr benötigt werden (belege hierfür vorzugsweise das onExit Event). Anmerkung: Ich habe schon einen WIG gesehen, der ohne Absturz auf Garmins bis zu 19 aktive Zonen benutzt hat. Allerdings waren dies Punktzonen und das Gerät hat ganz sicher auch etwas zäh reagiert. Nehmt diesen Wert als Anhaltspunkt und seid sparsam mit den Zonen - wenn ihr partout mehr gleichzeitig aktive Zonen benötigt, könnt ihr es mit Punktzonen bzw. einfach geformten Zonen versuchen - alternativ mit LUA kann man auch eine Zonenautomatik einbauen, die z.b. die 5 oder 6 nächstgelegenen Zonen automatisch aktiviert und alle anderen deaktiviert. Es existieren bereits Cartridges mit einer Zonenautomatik (einfach bodenseepingu ansprechen)
  • Vermeide kompliziert geformte Zonen - je komplexer eine Zone ist - je mehr Punkte sie hat - ggf. spielt auch die Form (konkav/konvex) noch eine Rolle - desto mehr hat ein Garmin zu rechnen und desto weniger Zonen können gleichzeitig aktiv sein.
  • Vermeide offene Inputs während OnEnter/OnExit Events. Überlagert sich eine Message ausgelöst durch ein Zonenevent mit einem offenen Input so kommt es zum Absturz der Cartridge. Ein möglicher funktionierender Workaround besteht darin einen "Interrupt" einzubauen in Form eines RETURN ("return" als Lua Keyword einfügen), wenn die Eingabe leer ist. Eine Veranschaulichung diese Phänomens sowie die passende Gegenmaßnahme für Urwigo kann man sich hier herunterladen. Danke an Charlenni für diesen "Hot Fix". Info : Der Absturz tritt nur beim Inputtyp "Text" auf, "Number" (Zahleneingaben) kann ohne Workaround verwendet werden.
  • Vermeide Umlaute wie ä,ö,ü,ß. Sie werden meist durch "?" oder a,o,u angezeigt, es gibt hier eine Demo-Cartridge für diejenigen, die auf deutsche Umlaute nicht verzichten wollen (für Urwigo)
  • Vermeide die Stromsparfunktion, einige Geräte stürzen ab, wenn sie aktiv wird (bei manchen Cartridges reproduzierbar vor allem im Zusammenhang mit Eingabe-Dialogen)
  • Benutze zwecks Kompatibilität nur Bilder vom Typ JPG mit einer Farbtiefe von 24bpp (auch Schwarzweißbilder). Reproduzierbar werden bei den Garmin Geräten sowohl (Farb)bilder vom Typ BMP, GIF und PNG, als auch JPG Schwarzweißbilder mit einer Farb-/Graustufentiefe von 8bpp NICHT angezeigt.
  • Das Urwigo Kommando Stop sound, wird bei einigen Playern ignoriert, weswegen hier der Sound unbeirrt weiterläuft. Um einen sicheren Soundstop zu erreichen, füge nach Stop Sound noch einen weiteren Sound ein, der lediglich aus 1 Sekunde Stille besteht. Effekt : Wird der Stop Sound Befehl ignoriert, so sorgt der "leere" Sound für eine Unterbrechung des aktuell laufenden, also : Stop Sound > Play Sound [leere MP3 Datei]
  • automatische Bildwechsel: bei iPhone muss man bei jedem Bildwechsel bei Items bestätigen (Bilder von Messages lassen sich automatisch wechseln ohne Bestätigung). Anmerkung: Inzwischen scheint das nicht mehr bei jedem Apfel-Gerät der Fall zu sein. Hier mögen doch bitte die Apfel-Benutzer reinschreiben, was denn nun Fakt ist und was nicht
  • bei Items, die 'on proximity' sichtbar werden, funktionieren Kommandos auf iPhone nicht (PiGo bzw. Wherigo-Player vor Version 1.3.7). Seit der Wherigoversion 1.3.7 ist dieser Fehler behoben
  • Die Navigation zu Items / Charakteren die eine Koordinate enthält, wird auf dem iPhone nicht unterstützt. Das iPhone kann nur auf Zonen navigieren.
  • Vermeide Eingaben (Inputs) mit mehr als 18 Zeichen. Das Eingabefeld beim Garmin Oregon (auch andere?) kann nur 18 Zeichen aufnehmen, wobei bei längeren Eingaben immer das letzte Zeichen überschrieben wird. Andere Geräte/Player können auch längere Eingaben verarbeiten.
  • Vermeide Bildgrößen, die größer als 230px breit sind. Zu grosse Bilder führen auch playerabhängig dazu, dass man um zusätzlichen Text zu lesen ggf. scrollen muss - daher sollten Bildgrößen sorgfältig gewählt werden.

Unterschiedliche Verhaltensweisen bzw. Darstellungsarten findet ihr auch unter: Unterschiedliches Verhalten einzelner WIG-Player.

Dinge, die man vermeiden sollte, weil man das Verhalten des Players evtl. nicht gut findet

  • Wenn man mit Items in Items arbeitet, werden auf dem iPhone für verkettete Items (Koffer: Kommando einpacken geht mit Hut, Mütze, Schal) auch Items angeboten, die nicht im Inventar sind - d.h. z.b. in einem Regal liegen - bei allen anderen Playern werden diese Items nicht angeboten zur Auswahl - hier entweder noch explizit die Items vorher prüfen oder aber beim Reinlegen in Container-Items unsichtbar machen...
  • Uhrzeit (os.date): Verschiedene Player geben verschiedene Zeiten aus (verschiedene Zeitzonen, Garmin = ME(S)Z, Whereyougo: GMT - ausserdem ist auf den meisten Playern die Uhrzeit durch Zeitumstellung manipulierbar.
  • Bildformate: abgesehen davon, dass Bilder max. 230px breit sein sollten, kann es sein, dass manche jpg-Bilder auf Garmin nicht angezeigt werden, andere Formate als jpg - z.b. gif sollte man auch nicht verwenden - sollte das vorkommen, hilft ein Konvertieren der Bilder - z.b. in ein PNG-Format und wieder zurück in ein jpg-Format.

Syntax-Konstruktionen in LUA, die Probleme machen bzw. zu Abstürzen führen

  • table.getn führt auf Whereyougo/OpenWig zum Absturz, stattdessen # benutzen oder mit einer for-Schleife über alle Table-Einträge drübergehen (for key, value in pairs(table)...)
  • print wird auf dem iPhone nicht unterstützt, also rechtzeitig bei Fertigstellung rausnehmen
  • String-Operationen auf Variablen, die den Wert nil enthalten - z.B. concatenate, gsub (Fehler bei Whereyougo). Kann durch vorherige If-Abfrage vermieden werden.
  • Distance: Auf Whereyougo/OpenWig funktioniert nur eine Methode, um aus einer Distance wieder Meter zu bekommen ('ft' geht auch):

                  local d = Wherigo.Distance(100,'m')
local dn = d:GetValue 'm'

  • GetAllofType: Klasse Funktion, die leider im Moment auf Whereyougo/Openwig nicht implementiert ist - man kann die fehlende Funktion aber quasi nachprogrammieren - unter [[1]] gibts Beispielcode und Lösungsansätze dazu, über alle Elemente eines Wherigo's drüberzugehen (geht leider nicht über Dialoge oder Messages, weil hier keine Objekte existieren)
  • Wenn man mit der Funktion Contains arbeitet unter LUA muss man bei Android aufpassen - Lässt man da Contains auf Objekte los, die kein Item oder Character sind, kann es Abstürze geben.
  • Wherigo.VectorToPoint: Diese Funktion liefert auf dem I-Phone zumindest bis Player-Version v317 einen um 180Grad verkehrten Bearing-Wert. Vorrangig Play-Anywheres von bodenseepingu (z.B. Geo-Memory) sind davon betroffen - ist meist der Fall, wenn die Lage einer Linie, die aus 2 Punkten gebildet wird ausgewertet wird....Abhilfe: eigene Funktion, siehe Geoclub [2]
  • Wherigo.Distance beim iPhone: muss immer in der Form Wherigo.Distance(variable,'m') oder Wherigo.Distance(variable,'ft') erfolgen, da es sonst zu Folgefehlern kommen kann z.b. bei Wherigo.TranslatePoint. Wichtig für alle Play-Anywhere-Cartridges !!! Oder Spezialitäten wie Resize_Zone
  • Player.Container beim Android und iPhone: Eigentlich wäre das eine sehr nützliche Funktion <object>.Container enthält immer ein Objekt in dem ein Gegenstand drin liegt...Das funktioniert für Character und Items meines Wissens auf allen Geräten (I-Phone muss sich noch zeigen) - jedoch darf man das keinesfalls auf das Player-Objekt anwenden - I-Phone und Android stürzen dabei ab.
  • inputname.Choices bei Android: Aus lua heraus kann man programmgesteuert die Elemente für eine MultipleChoice-Auswahl befüllen. Bei Android müssen die Tabellenwerte dabei allerdings explizit Strings sein, damit die Werte auch als Auswahl angeboten werden, ansonsten funktioniert die Eingabe nicht. Beispiel:

   -- Eine Auswahl erlaubter Zahlen in einen Multiple-Choice Input einfügen
   myInput.Choices = {}
   for i = 1, 34 do
       if allowed[i] then
           table.insert(myInput.Choices,tostring(i)) -- so funktioniert es!
           -- table.insert(myInput.Choices,i) -- so funktioniert es auf Garmin, aber nicht auf Android!
       end
   end

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge