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

iPhone und lua-Programmierung

Krolock

Geocacher
Nachdem wir beim Cachopoly-Event bereits Probleme mit dem iPhone hatten wollte nich nun der Sache mal auf den Grund gehen und NoGos fürs Eiertelefon auflisten.

Die erste Sache dir mir aufgefällt, ist dass das iPhone kein print kann.
iPhone-Print.PNG
Das heißt debug Ausgaben wie
Code:
print("Der Spieler hat die Zone erreicht")
sind nicht auf dem Gerät.

Da ich leider (zum Glück?) kein iPhone besitze wirst bei mir mit dem Testen schwierig.

Welche KnownBugs gibt es denn noch bei der Apfel-App?
 

xxmurdockxx

Geomaster
Einen Fehler hat das aktuelle Update vom Wherigo-Player ausgebügelt. :D
Messages oder Bilder können überschrieben werden.
Somit ist die Anzeige von z.B. der Restzeit eines Timers im Sekundenwechsel
möglich, oder z.b. der Wechsel von Bildern ohne immer OK klicken zu müssen.

Du kannst mir gerne ein WIG mit allerlei LUA-Code schicken.
Ich teste sie dann. ;)
 
OP
Krolock

Krolock

Geocacher
xxmurdockxx schrieb:
Du kannst mir gerne ein WIG mit allerlei LUA-Code schicken.
Ich teste sie dann. ;)

Ich hab soeben die 1.7er Version von Cachopoly ohne print hochgeladen.
http://www.wherigo.com/cartridge/details.aspx?CGUID=97f7c396-9feb-4d43-bb3a-a183f59e0934
Wenn du das testen könntest wäre das prima.
VG Markus
 

xxmurdockxx

Geomaster
Heute konnte ich mal die Cartridge testen.
Hab Sie schon gestern mal im Simulator getestet und dort lief alles problemlos.

Heute mit 3gs und einem 4er eine freie Stelle gesucht und begonnen.
Start, Anywhere ausgewählt und die ersten Eckpunkte definiert.

Nach dem letzten Eckpunkt kam bei beiden folgender Fehler:
Lua Alert: op_gettable
Der Fehler kam mehrmals wobei der Index hochgezählt wurde.
Danach lief die Cartridge auf dem 4er weiter. Das 3gs streikte.
Ach das erneute Abstecken der Eckkoordinaten scheiterte beim 3gs.

Beim Würfeln wird NUR die 6 angezeigt und erst beim Ende des Würfelvorgangs die gewürfelte Zahl. Bei jedem Würfeln ist dies so.

Dann lief es soweit bis zum Kauf einer Strasse.
Dort erschien dann diese Meldung:
Lua Alert: op_gettable
Und dann noch folgende Meldung (haben leider den Screenshot vergessen)
Don´t knot how to call null
Dann wurden plötzlich die Zonen verschoben, und die Strassen waren völlig außerhalb des abgesteckten Spielfeldes.

Um die Computerspieler zum Zug zu bringen musste immer erst ins Inventory gewechselt werden.

Bezüglich dem Würfelproblem hab ich Dir mal ein Beispiel angehängt.
Dies funktioniert auch beim IPhone.

Hoffe ich konnte Dir ein wenig helfen.

Grüße Stefan
 

Anhänge

  • IMG_0530.PNG
    IMG_0530.PNG
    103,8 KB · Aufrufe: 1.142
  • IMG_0538.JPG
    IMG_0538.JPG
    25,4 KB · Aufrufe: 1.142
  • wuerfeltest.zip
    21,1 KB · Aufrufe: 20
OP
Krolock

Krolock

Geocacher
xxmurdockxx schrieb:
Dann lief es soweit bis zum Kauf einer Strasse.
Dort erschien dann diese Meldung:
Lua Alert: op_gettable
Und dann noch folgende Meldung (haben leider den Screenshot vergessen)
Don´t knot how to call null

Hallo Stefan,
dein Würfelbeispiel sieht ganz gut aus, ich konnte allerdings noch nicht erkennen wo bei meinem Code der Unterschied ist, der den op_gettable Fehler provoziert.

Ich hab mit CPI.rar den Teil des Straßenkaufes extrahiert. Kannst du bitte testen, ob dies auf dem iPhone auch zum Fehler führt?
Gibt es auf dem iPhone auch ein log-File um den Fehler einzuschränken?

Nach http://luaj.sourceforge.net/api/2.0/org/luaj/vm2/Lua.html#OP_GETTABLE schätze ich mal, es geht hier um eine Operation um auf Tabellenwerte zuzugreifen.

VG Markus
 

Anhänge

  • CPI.rar
    47 KB · Aufrufe: 20

xxmurdockxx

Geomaster
Krolock schrieb:
Ich hab mit CPI.rar den Teil des Straßenkaufes extrahiert. Kannst du bitte testen, ob dies auf dem iPhone auch zum Fehler führt?
Die läuft ohne Probleme.

Gibt zwar ein Consolen-Log, aber das ist leer.
Werde bei Gelegenheit nochmal die Spielfeldabsteckung testen, ob in das Log nur die Fehler geschrieben werden.

Ist das Logging immer an bei der Cartridge?
Kann man ja beim Urwigo explizit an- und ausmachen.

Grüße
Stefan
 
OP
Krolock

Krolock

Geocacher
Wenn ich mir die Fehlermeldungen anschaue, schließe ich auf eine IndexOutOfArray Situation.

Sprich, im Feld sind nur 4 Element defniert, aber das 5 soll abgefragt werden.

Ich werd nochmals den Code der Initialisierung der 4 Spielfeldecken durchschauen, ob dort was iPhone kritisches stehen könnte.
 

xxmurdockxx

Geomaster
Hab heute nochmal bei einem Spaziergang das Spielfeld abgesteckt.

Bin zwar nicht im Viereck gelaufen, konnte aber trotzdem die 4 Ecken bestimmen.
Das hat soweit auch ohne Fehlermeldung geklappt.
Dann den Spielernamen eingegeben und bei Nicht-Eingabe des 2. Spielers
(also Computergegner) kamen dann die schon erwähnten Fehlermeldungen.

In dem Consolen-Log steht folgendes:
! 09-10 13:50:26 op_gettable: index is 5, array count=4, dict count=0
! 09-10 13:50:33 op_gettable: index is 6, array count=4, dict count=0
! 09-10 13:50:38 op_gettable: index is 7, array count=4, dict count=0
! 09-10 13:50:43 op_gettable: index is 8, array count=4, dict count=0

Genau die Meldung wird auch angezeigt.
Nach Klicken aufs Inventory kommt die Meldung mit dem Spieler und würfeln.
Dann bleibt das Spiel hängen. Nur die 6 wird angezeigt. Kein Würfelergebnis.
Geht nicht mehr weiter. Hab dann die verbotene Taste gedrückt. ;)
Komm zwar wieder raus, aber bei erneutem Klick ins Inventory bleibt die cartridge dann definitiv hängen.

Getestet auf dem 3GS.

Grüße
 
OP
Krolock

Krolock

Geocacher
Wie es aussieht führt der iPhone -Player alle definierten Funktionen bei der Initialisierung aus.
So gibt es im Cartrigde den Character Mitspieler an dem 8 Kommandos zur Anzeige der (bis zu 8) Mitspielerstati. Dieses Kommando löst beim Aufruf einen Zugriff auf das Array objCharacters aus, dass bei der Eingabe eines meschlichen Spielers nur aus 4 Spieler besteht.
Es scheint so, dass PiGo alle 8 Kommandos beim Start ausführt. Es wird also auch für Spieler 5,6,7 und 8 ausgeführt, die es nicht gibt und somit folgerder Zugriff ungültig ist.
Code:
local p = objCharacters[5]
In der 1.9 Version ist ein Check eingebaut, der überprüft, ob das Array wirklich groß genug ist für den Zugriff
 
OP
Krolock

Krolock

Geocacher
Mir ist soeben noch eine weitere mögliche Gefahrenquelle aufgefallen.
Beim Start wird mit den Bedingungen
Code:
if objCharacters[5] ~= nil then ....
if objCharacters[6] ~= nil then ....
if objCharacters[7] ~= nil then ....
if objCharacters[8] ~= nil then ....

Kann es sein, dass PiGo bei einer Abfrage auf ein Array mit Index > #array einen op_gettable Fehler wirft, statt nil zurückzugeben?
Dieses Verhalten kenne ich zumindest aus anderen Programmiersprachen (z.B IndexOutOfBoundException in java).

@Stefan: Wenn du die aktuelle 2.0 Version von Cachopoly startest (Vordefinierter Modus Asbach dürfte reichen) und es wirklich der ungültige Arrayzugriff ist, so dürftest du nur noch
Code:
! 09-10 13:50:26 op_gettable: index is 5, array count=4, dict count=0
! 09-10 13:50:33 op_gettable: index is 6, array count=4, dict count=0
! 09-10 13:50:38 op_gettable: index is 7, array count=4, dict count=0
erhalten, da ich die Abfrage des 8.Spielers abgeschaltet habe.

if objCharacters[5] ~= nil then ....
if objCharacters[6] ~= nil then ....
if objCharacters[7] ~= nil then ....
if objCharacters[8] ~= nil then ....
 

xxmurdockxx

Geomaster
Krolock schrieb:
Kann es sein, dass PiGo bei einer Abfrage auf ein Array mit Index > #array einen op_gettable Fehler wirft, statt nil zurückzugeben?
Dieses Verhalten kenne ich zumindest aus anderen Programmiersprachen (z.B IndexOutOfBoundException in java).
:shocked: Das kann wohl sein. :D
Davon hab ich so gar keine Ahnung. :kopfwand:

Deine Vermutung stimmt, und es kommen nur die Meldungen bis index=7.

Jetzt hab ich auch ein Ergebnis beim Würfeln.
Es wird aber immer noch NUR die 6 angezeigt beim Würfeln.
 
OP
Krolock

Krolock

Geocacher
mit V 2.1 werden die Arrayabfragen > Index über einen #array check verhindert.
Beim Würfeln wird math.random(1,6) statt math.random(6) verwendet.
Evtl. war dies das Problem beim Würfeln.
 

xxmurdockxx

Geomaster
und gleich gecheckt....

LUA-Error kommt nicht.
Würfel bleibt aber bei 6. :???:
Ist die Bildfolge jede Sekunde, oder schneller?

evtl. liegts auch am 3gs.

Werd mal jemanden mit dem 4er anfragen.
 

bodenseepingu

Geomaster
ups...wenn ihr durch seid, brauch ich glaub auch mal gesammelt die Infos, was man alles fürs I-Phone nicht machen darf....ich hab noch jede Menge an Play Anywhere Cartridges zum Durchtesten, falls es I-Phone-Benutzern zu langweilig wird...
 

bodenseepingu

Geomaster
Hallo,

am WE wurde eine eigentlich sehr gut getestete Cartridge aus dem Saarland, die mit Owner-Erlaubnis an den Bodensee adaptiert wurde, veröffentlicht.

I-Phone-Benutzer steigen offensichtlich reproduzierbar an einer Stage aus.

Ich hab mir den Code angeschaut und hätte ne Frage an die Programmierer/I-Phone-Besitzer/Benutzer:

Kann es sein, daß der I-Phone-Player nicht damit zurecht kommt, wenn ein Gegenstand einer Person zugeordnet wird und im weiteren Spielverlauf per IF-Bedingung abgefragt wird (Wenn Person enthält Gegenstand) ? Kann das jemand bestätigen? Wenn der Gegenstand in einer Zone liegt gibts offensichtlich keine Probleme.

Der Code ist an dieser Stelle eindeutig - der Gegenstand wird irgendwann vorher vom Player an die Person gemovet und später wenn diese Person auftaucht wird abgefragt, ob die Person den Gegenstand besitzt - auf dem I-Phone geht diese If-Bedingung in den Else-Zweig und damit kann die Cartridge nicht gespielt werden - auf allen anderen Geräten gibt es keine Probleme.
 

xxmurdockxx

Geomaster
Hi,

also bei meiner Cartridge wird bei einer Zone ein Gegenstand nach Auswahl zur Person geschoben.
In einer anderen Zone gibt es einen Dialog, dessen Verlauf davon abhängig ist, ob der Gegenstand dabei ist oder nicht.

Hat soweit ich weiß immer funktioniert.
 

bodenseepingu

Geomaster
Also ich meine jetzt nicht, dass ein Gegenstand zum Player geschoben wird.

Im obigen Beispiel wird der Gegenstand einfach zu einer Person "Vogel" geschoben und
in der IF-Bedingung genauso abgefragt if "Vogel" enthält "Gegenstand"
 

bodenseepingu

Geomaster
Ein erster Test auf einem I-Phone hat den Verdacht nicht bestätigt. Das I-Phone behandelt die obige IF-Bedingung korrekt.

Ich versuche dennoch der Sache nachzugehen - möglicherweise hat das I-Phone einfach einen einer Person (nicht Player) zugewiesenen Gegenstand verloren - evtl. durch Speichern / Neu-Laden - auf jeden Fall war die entsprechende IF-Bedingung auf einem Else-Zweig gelandet, der so nicht vorkommen kann.
 
Oben