2014年07月17日

cocosbuilder使えず

やっと開発者らしい内容を。

cocos2d-x 3.1.1 、cocosbuilder 3.0-alpha5で詰まった。

cocosbuilderでCCMenuを追加し、プロジェクトでそれをタップした時にイベントを実行させるための部分。
書籍やブログでいろんな方々が紹介されている標準的な方法だと思う。

cocos2d::SEL_MenuHandler GameLayer::onResolveCCBCCMenuItemSelector(cocos2d::Ref* pTarget, const char* pSelectorName)
{
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "tappedTest”, GameLayereLayer:: tappedTest);
}

この、CCB_SELECTORRESOLVER_CCMENUITEM_GLUEの行がエラーでビルドできない。

エラー↓
Static_cast from 'void (GameLayer::*)(cocos2d::Ref *, cocos2d::extension::Control::EventType)' to 'cocos2d::SEL_MenuHandler' (aka 'void (cocos2d::Ref::*)(cocos2d::Ref *)') is not allowed

マクロを展開し、調べていくとどうもcocos2d 3.xからはmenu_selectorというのが使えないらしく以下に書き換えたがまた別のエラーになる。
    if(pTarget == this && strcmp(pSelectorName, "tappedTest") == 0)
    {
        return static_cast<cocos2d::SEL_MenuHandler>(std::bind(&GameLayer::tappedTest, this, std::placeholders::_1, std::placeholders::_2))
    }

エラー↓
Cannot cast from type '__bind<void (GameLayer::*)(cocos2d::Ref *, cocos2d::extension::Control::EventType), GameLayer *, std::__1::placeholders::__ph<1> &, std::__1::placeholders::__ph<2> &>' to member pointer type 'cocos2d::SEL_MenuHandler' (aka 'void (cocos2d::Ref::*)(cocos2d::Ref *)')

rvalueリファレンスに関係がありそうでテンプレートを使ってキャストするなどやってみたがダメだった。
template<typename T_class>
T_class castFromRValue(T_class && f)
{
    return std::forward<T_class>(f);;
}

1週間ほどGoogle検索やStackOverflowなど検索してみましたが現状の私のスキルでは解決にいたれなかった。
何か根本的に別の問題があるのか。

とりあえず、英語の勉強とSpritebuilderの勉強を開始して次に進もうとしている。
posted by aso-developer at 17:29| Comment(2) | 日記