Last active
December 31, 2015 16:59
-
-
Save melpon/8016893 to your computer and use it in GitHub Desktop.
cocos2d-x のコールバックを 2.x で使えるようにしてみた
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef WITH_LAMBDA_INCLUDED | |
#define WITH_LAMBDA_INCLUDED | |
#include "cocos2d.h" | |
template<class Base, class Result, class... Args> | |
class BindCallback : public Base { | |
public: | |
typedef std::function<Result (Args...)> Callback; | |
typedef Result (cocos2d::CCObject::*Handler)(Args...); | |
Handler init_handler(Callback cb) { | |
USING_NS_CC; | |
cb_ = std::move(cb); | |
return static_cast<Handler>(&BindCallback::handler_); | |
} | |
private: | |
Result handler_(Args... args) { | |
return cb_(args...); | |
} | |
Callback cb_; | |
}; | |
template<class Base> | |
using BindScheduleCallback = BindCallback<Base, void, float>; | |
typedef std::function<void (float)> ScheduleCallback; | |
template<class Base> | |
using BindCallFuncCallback = BindCallback<Base, void>; | |
typedef std::function<void ()> CallFuncCallback; | |
template<class Base> | |
using BindCallFuncNCallback = BindCallback<Base, void, cocos2d::CCNode*>; | |
typedef std::function<void (cocos2d::CCNode*)> CallFuncNCallback; | |
template<class Base> | |
using BindCallFuncNDCallback = BindCallback<Base, void, cocos2d::CCNode*, void*>; | |
typedef std::function<void (cocos2d::CCNode*, void*)> CallFuncNDCallback; | |
template<class Base> | |
using BindCallFuncOCallback = BindCallback<Base, void, cocos2d::CCObject*>; | |
typedef std::function<void (cocos2d::CCObject*)> CallFuncOCallback; | |
template<class Base> | |
using BindMenuCallback = BindCallback<Base, void, cocos2d::CCObject*>; | |
typedef std::function<void (cocos2d::CCObject*)> MenuCallback; | |
template<class Base> | |
using BindEventCallback = BindCallback<Base, void, cocos2d::CCEvent*>; | |
typedef std::function<void (cocos2d::CCEvent*)> EventCallback; | |
template<class Base> | |
using BindCompareCallback = BindCallback<Base, int, cocos2d::CCObject*>; | |
typedef std::function<int (cocos2d::CCObject*)> CompareCallback; | |
template<class T, class F> | |
static T* createWithInitFunc(F f) { | |
auto p = new T(); | |
if (f(p)) { | |
p->autorelease(); | |
return p; | |
} else { | |
delete p; | |
return nullptr; | |
} | |
} | |
// 以下好きなだけ関数を追加していくこと | |
/* | |
使い方: | |
void Object::handler(CCObject*) { | |
// ここに処理を書く | |
} | |
... | |
auto p = CCMenuItemLabel::create(label, this, menu_selector(handler)); | |
の代わりに以下のように書く | |
auto p = createMenuItemLabel(label, [this](CCObject*) { | |
// ここに処理を書く | |
}); | |
*/ | |
static cocos2d::CCMenuItemLabel* createMenuItemLabel(cocos2d::CCNode* label, MenuCallback cb) { | |
typedef BindMenuCallback<cocos2d::CCMenuItemLabel> BF; | |
return createWithInitFunc<BF>([&](BF* p) { | |
return p->initWithLabel(label, p, p->init_handler(std::move(cb))); | |
}); | |
} | |
static cocos2d::CCMenuItemSprite* createMenuItemSprite(cocos2d::CCNode* normalSprite, cocos2d::CCNode* selectedSprite, cocos2d::CCNode* disabledSprite, MenuCallback cb) { | |
typedef BindMenuCallback<cocos2d::CCMenuItemSprite> BF; | |
return createWithInitFunc<BF>([&](BF* p) { | |
return p->initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, p, p->init_handler(std::move(cb))); | |
}); | |
} | |
#endif // WITH_LAMBDA_INCLUDED |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment