Cocos2d-x Touch Event

Handle touch event

Override event method and set listener.


class GameScene : public cocos2d::Layer
   // Override methods
   bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event);
   void onTouchMove(cocos2d::Touch *touch, cocos2d::Event *event);
   void onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *event);
   void onTouchCancelled(cocos2d::Touch *touch, cocos2d::Event *event);

onTouchBegan, onTouchMove, onTouchEnded, onTouchCancelled
You don’t need to override everything. Just only you need.


bool GameScene::init()
   // Cut several codes

    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(GameScreen::onTouchBegan, this);
    listener->onTouchMoved = CC_CALLBACK_2(GameScreen::onTouchMoved, this);
    listener->onTouchEnded = CC_CALLBACK_2(GameScreen::onTouchEnded, this);
    listener->onTouchCancelled = CC_CALLBACK_2(GameScreen::onTouchCancelled, this);
    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
    isTouching = false;
    touchPosition = 0;

    return true;

// Touch Events
bool GameScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event) {

	isTouching = true;
	touchPosition = touch->getLocation().x;
	return true;

void GameScene::onTouchMove(cocos2d::Touch *touch, cocos2d::Event *event) {


void GameScene::onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *event) {
	isTouching = false;

void GameScene::onTouchCancelled(cocos2d::Touch *touch, cocos2d::Event *event) {
	onTouchEnded(touch, event);

Multi Touch

How to Enable Multi-Touch
By default, it’s not required any setting for Android.(iOS is needed)

Node Rect

To detect touch position and node, this is helpful for you.

cocos2d::Rect Utils::getRect(cocos2d::Node* node) {
   cocos2d::Point point = node->getPosition();
   int width = node->getContentSize().width;
   int height = node->getContentSize().height;
   return cocos2d::Rect(point.x - (width / 2), point.y - (height / 2), width, height);

How to use?

bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event) {
   Point location = touch->getLocation();
   Label *reset = (Label *)this->getChildByName("reset");
   cocos2d::Rect resetRect = Utils::getRect(reset);   // Rect
   if (resetRect.containsPoint(location)) {
      // Touch
   return true;