Cocos2d-x with Lua – tolua++での型キャスト

Cocos2d-xでLuaを利用中に問題あったので覚書。

CCNode*等で返ってきたobjectのcastについて。

scene:addChild(CCLabelTTF:create("hoge", "Arial", 16.0), 0, タグ番号)<br /> ...<br /> local label = scene:getChildByTag(タグ番号)<br /> label:setString('hogehoge')

こんなコードを書くとlabel変数はsetString呼び出しに失敗することがあります。そもそもlabelはusertype CCNodeのはずですのでsetStringが成功するのもおかしいのですが、作成してしばらくはgetChildByTagはusertype CCLabelTTFを戻しますので成功してしまいます。

CCNodeが返ってきた場合は型を変更する必要があります。これにはtolua.castを使用します。

http://www.codenix.com/~tolua/tolua++.html#additional_features

ここを見るとincluding namespaceとなっています。

tolua.cast(label, “cocos2d::CCLabelTTF”)

この場合、castしようとしたclassが見つからないため、tolua.castはエラーも吐かず、何もせずに、そのまま戻ってきてしまいます。

それでもCCLabelTTF作成後しばらくは、CCLabelTTFが戻ってくるので問題が発生しません。ただ、その後いきなりCCNodeが返ってくるようになりメソッド呼び出しが失敗するという良くわからないバグに悩む事になります。

Cocos2d-xのtolua++によるBindの場合は以下のようにnamespaceを付けない事で正常に動作するようになります。

tolua.cast(label, “CCLabelTTF”)

こんな事を防ぐためにもtolua.castした後でtolua.typeで型を確認するようにしたほうが良いのかもしれません。