Corona SDK シミュレーター、バージョン 2013.1137 (2013.6.7) で次のエラーが表示されます。
Corona Simulator Runtime error
File: ?
Attempt to perform arithmetic on field '?' (a function value)
stack traceback:
[C]: ?
?: in function <?:172>
?: in function <?:218>
このエラーは、次のコード ( main.lua )によって発生します。
local d1 = display.newCircle(0, 40, 10)
local gNonEmpty1 = display.newGroup()
gNonEmpty1:insert(display.newCircle(0, 70, 10))
local gEmpty1 = display.newGroup()
transition.to(d1, { time = 1000, x = 100 })
transition.to(gNonEmpty1, { time = 1000, x = 100 })
transition.to(gEmpty1, { time = 1000, x = 100 })
local d2 = display.newCircle(0, 150, 10)
local gNonEmpty2 = display.newGroup()
gNonEmpty2:insert(display.newCircle(0, 180, 10))
local gEmpty2 = display.newGroup()
transition.to(d2, { time = 1000, x = 100, transition = easing.outExpo })
transition.to(gNonEmpty2, { time = 1000, x = 100, transition = easing.outExpo })
transition.to(gEmpty2, { time = 1000, x = 100, transition = easing.outExpo })
local d3 = display.newCircle(0, 260, 10)
local gNonEmpty3 = display.newGroup()
gNonEmpty3:insert(display.newCircle(0, 290, 10))
local gEmpty3 = display.newGroup()
transition.to(d3, { time = 1000, x = 100, easing.outExpo })
transition.to(gNonEmpty3, { time = 1000, x = 100, easing.outExpo })
transition.to(gEmpty3, { time = 1000, x = 100, easing.outExpo })
エラーの原因となっている実際の行は、最後から 2 番目の行です。
transition.to(gNonEmpty3, { time = 1000, x = 100, easing.outExpo })
コメントすることで確認できます。
コロナのドキュメントには、次のように記載されています。
You should have at least one DisplayObject inserted into a
Display Group before you change or read any of the properties
of the group (e.g., x, y, setReferencePoint(), etc.).
したがって、gEmpty1、gEmpty2 、またはgEmpty3でtransition.to を使用すると、奇妙な動作が予想されるのは当然です。予想どおり、 transition.toの最初の 2 つのブロック (合計 6 回の呼び出し) は同じように動作しますが、デフォルトであるイージング、最初の 3 つの呼び出しの easing.linear 、および他の 3つの呼び出しのeasing.outExpoを除いては同じです。呼び出します。
transition.to呼び出しの書き方を間違えて、最後の 3 つのtransition.to呼び出しのように、イージング関数の指定でtransition=の部分が抜けているようなものを書くと、驚くべきことに、空でないグループを対象とするgNonEmpty3は、理解できないエラー メッセージの原因です。
質問
- 行番号もファイル名もなく、疑問符だけのエラーが発生した場合、Corona SDK で何をすべきですか?
- 172 と 218 の 2 つの行番号以外に、Corona SDK が意味のあるレポートを提供できないのはなぜですか?
- なぜこのエラーが発生するのですか? 私の理論では、transition.toはあまりエラー チェックを実行しません。空のグループをターゲットにすると、イージング関数を指定する際のエラーは見過ごされます。おそらくこれは、空のグループ プロパティを使用してはならないという事実に関連しているため、transition.to またはその内部更新コールバックがグループが空であることを検出し、何もせずに単純に戻る可能性があります。代わりに、空でないグループの場合、transition =が欠落しているため、必ずしもイージング コードではなく何らかのコードがトリガーされ、そのコードで実際のエラーが発生します。
config.lua
application = {
content = {
width = 320,
height = 480,
scale = "letterBox",
fps = 30
}
}
元の投稿 (廃止)
Corona SDK のエラーを追跡するのに苦労しています。このエラーにより、シミュレーターは次のメッセージを表示します。
Corona Simulator Runtime error
File: ?
Attempt to perform arithmetic on field '?' (a function value)
stack traceback:
[C]: ?
?: in function <?:172>
?: in function <?:218>
そのようなメッセージをどのように解釈すればよいでしょうか? ところで、私はそれほど多くの行を含むソース ファイルを持っていません。
Button.lua という名前のファイルがあり、41 行目は例外の発生に関与しているようですが、その行からは発生していません。行は次のとおりです。
button:insert(b1)
その行を 2 つのプリントの間に折り込みました。
print("Before", button, b1)
button:insert(b1)
print("After")
次のメッセージがシミュレータ コンソールに出力されます。
Corona Simulator[9801:f03] Before table: 0x11daf4aa0 table: 0x1152363a0
Corona Simulator[9801:f03] After