Skip to content

Instantly share code, notes, and snippets.

@melpon
Last active December 31, 2015 16:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save melpon/8016893 to your computer and use it in GitHub Desktop.
Save melpon/8016893 to your computer and use it in GitHub Desktop.
cocos2d-x のコールバックを 2.x で使えるようにしてみた
#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