Ще одним прикладом використання макросу CC_CALLBACK може бути робота з клавіатурою.
Для того, щоб додати у програму можливість обробки клавіатури, в init сцени треба додати такий код:
// keyboard processing
EventListenerKeyboard* sceneKeyboardListener = EventListenerKeyboard::create();
sceneKeyboardListener->onKeyPressed = CC_CALLBACK_2(ActionsDemoScene::onKeyPressedScene, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(sceneKeyboardListener, this);
при цьому сама обробка натискання може виглядати так:
void ActionsDemoScene::onKeyPressedScene(EventKeyboard::KeyCode keyCode,
Event *event) {
printf("%s: processing key %d pressed\n", __func__, (int)keyCode);
if (EventKeyboard::KeyCode::KEY_A == keyCode) {
printf("%s: key 'a' was pressed\n", __func__);
}
else {
printf("%s: failed to process.\n", __func__);
}
}
Тобто, спочатку створюється об'єкт класу EventListenerKeyboard. Це такий маленький клас, що об'єднує пару вказівників на функції: onKeyPressed та onKeyReleased. Для наших потреб досить буде встановити лише один з них. Ми це робимо, використовуючи макрос CC_CALLBACK_2, тому що метод, який оброблятиме натискання, отримує два параметри.
Потім ми реєструємо новостворений об'єкт у глобальному EventDispatcher, який у Cocos2d відповідає за обробку подій.
Теоретично, обробник колбеків зовсім не обов'язково має бути методом сцени. Можна було б реалізувати цю функціональність у якому-небудь іншому класі. Просто це досить зручно, тому що у невеликій програмі саме сцена має доступ до всіх об'єктів, що на ній знаходяться.