2016년 1월 1일 금요일

Cocos2d-x CC_CALLBACK_0, Callback functions


Cocos2d-x has callback functions like

CC_CALLBACK_0
CC_CALLBACK_1
CC_CALLBACK_2
CC_CALLBACK_3

these functions are defined functions.

// new callbacks based on C++11 #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

CC_CALLBACK_(N) function N means, the number of callback function pass parameters.

CC_CALLBACK_0 function: pass no parameter.
CC_CALLBACK_1 function: pass one parameter.
CC_CALLBACK_2 function: pass two parameter.

example code)
https://gist.github.com/pineoc/ca43124d321acb21486d

bool HelloWorld::init()
{
/*has some code*/
//CC_CALLBACK_0 function
auto sprite1 = Sprite::create("CloseNormal.png");
auto callback = CCCallFunc::create(CC_CALLBACK_0(HelloWorld::myFunction1, this));
sprite1->runAction(callback);
this->addChild(sprite1);
auto sprite2 = Sprite::create("CloseNormal.png");
auto callback = CCCallFunc::create(CC_CALLBACK_1(HelloWorld::myFunction2, this));
sprite2->runAction(callback);
this->addChild(sprite2);
auto btn = Button::create("CloseNormal.png","CloseNormal.png");
btn->addTouchEventListener(CC_CALLBACK_2(HelloWorld::myFunction3, this));
this->addChild(btn);
}
void HelloWorld::myFunction1()
{// no passed param
CCLOG("myFunction1");
}
void HelloWorld::myFunction2(Ref* pSender)
{//one passed param
CCLOG("myFunction2");
}
void HelloWorld::myFunction3(Ref* pSender, Widget::TouchEvent e)
{//two passed param
//Button event listener
CCLOG("myFunction3");
}
CC_CALLBACK_3 function: pass three parameter.
example code)
http://www.cocos2d-x.org/wiki/Game_Controller

void HelloWorld::registerControllerListener()
{
//create an evnetListenerController
_listener = EventListenerController::create();
//bind onConneected event call function
_listener->onConnected = CC_CALLBACK_2(HelloWorld::onConnectController,this);
//bind disconnect event call function
_listener->onDisconnected = CC_CALLBACK_2(HelloWorld::onDisconnectedController,this);
//bind onKeyDown event call function
_listener->onKeyDown = CC_CALLBACK_3(HelloWorld::onKeyDown, this);
//bind onKeyUp event call function
_listener->onKeyUp = CC_CALLBACK_3(HelloWorld::onKeyUp, this);
//bind onAxis event call function, onAxis will be called when analog stick is changed
_listener->onAxisEvent = CC_CALLBACK_3(HelloWorld::onAxisEvent, this);
//Activate the listener into the event dispatcher
_eventDispatcher->addEventListenerWithSceneGraphPriority(_listener, this);
//This function should be called for iOS platform
Controller::startDiscoveryController();
}
//Controller is the obejects of the Controller,keyCode means the keycode of the controller you click down
void HelloWorld::onKeyDown(cocos2d::Controller *controller, int keyCode, cocos2d::Event *event)
{
CCLOG("KeyDown:%d", keyCode);
}
void HelloWorld::onKeyUp(cocos2d::Controller *controller, int keyCode, cocos2d::Event *event)
{
//You can get the controller by tag, deviceId or devicename if there are multiple controllers
CCLOG("tag:%d DeviceId:%d DeviceName:%s", controller->getTag(), controller->getDeviceId(), controller->getDeviceName().c_str());
CCLOG("KeyUp:%d", keyCode);
}
//The axis includes X-axis and Y-axis and its range is from -1 to 1. X-axis is start from left to right and Y-axis is bottom to top.
void HelloWorld::onAxisEvent(cocos2d::Controller* controller, int keyCode, cocos2d::Event* event)
{
const auto& keyStatus = controller->getKeyStatus(keyCode);
CCLOG("Axis KeyCode:%d Axis Value:%f", keyCode, keyStatus.value);
}
void HelloWorld::onConnectController(Controller* controller, Event* event)
{
CCLOG("Game controller connected");
}
void HelloWorld::onDisconnectedController(Controller* controller, Event* event)
{
CCLOG("Game controller disconnected");
}
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
......
......
registerControllerListener();
return true;
}

댓글 없음:

댓글 쓰기

JIRA Plugin - ScriptRunner 소개 #2

관련 글 소개 #1:  https://pineoc.blogspot.com/2019/03/scriptrunner-1.html ScriptRunner 소개 #2 지난 글에서는 Behaviours를 보았고 다음 내용인 콘솔, 리스너 등을 ...