Cocos Code IDEとLuaでスマートフォンのゲームを作ろうとしている方、どのくらいいるのでしょうかね?
まだCocos Code IDEが新しくてバージョンもRC2なので少ないのかな?
でもC++よりLuaの方が扱いやすい!最初はどうせスプリクト言語なんだからC++より遅くて使いものにならないだろうと思っていました。
しかしCocos Code IDEとLuaの組み合わせは最高にいいですね!
さて、本題ですがLuaでハマったこと・・・
スケジューラーのscheduleScriptFuncメソッドで一定時間ごとに関数を呼び出すことができるのですが、よくわからないエラーが出ました。見た目上は問題なく動いているようだったのですが。
function GameScene:method1() local function timer1() -- この中でselfを使っている end self.schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(timer1, 10, false) end
上記メソッドでは10秒ごとにtimer1が呼び出されます。ファイルを修正して保存するとCocos Code IDEではリソースをアプリに送信してすぐに変更を反映してくれます。
そして、初回起動ではエラーが出ず、なぜかファイルの更新時にはエラーが出ました。
エラーの理由ですが、2回め移行の実行時に前のタイマーが生きているようで、それが呼ばれてしまっているのが原因だったようです。本来削除していなければならないスケジュールが実行され、timer1の中で存在しないインスタンスを参照しようとしてしまっていました。
まあ、Schedulerの後始末をちゃんとしていなかったってだけなのですが。
新規プロジェクトで作成されるサンプルアプリでは、
-- 中略 サンプルアプリのonNodeEvent関数内 if "exit" == event then cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.schedulerID) end
のようにちゃんとunscheduleScriptEntryしていましたね・・・