Cocos2d-x Touch Event

Handle touch event

Override event method and set listener.

.h

class GameScene : public cocos2d::Layer
{
public:
   // 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.

.cpp

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

    auto listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    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;
}