Cocos2d-x collision

Collision detection

Basic idea is same as Sprite Kit of iOS Collision in SpriteKit

Set physics world

Header

class GameScene : public cocos2d::Layer
{
public:
   // Phisics
    void setPhysicsWorld(cocos2d::PhysicsWorld* world) {
    	mWorld = world;
    	mWorld->setGravity(cocos2d::Vect(0,0));  // No gravity
    }

    bool onContactBegin(cocos2d::PhysicsContact& contact);
    cocos2d::PhysicsWorld* mWorld;
}

To enable physics, you need to change crateScene a bit.

Scene* GameScene::createScene()
{
    // 'scene' is an autorelease object
    //auto scene = Scene::create();
    auto scene = Scene::createWithPhysics();  // For physics

    // 'layer' is an autorelease object
    auto layer = GameScene::create();
    layer->setPhysicsWorld(scene->getPhysicsWorld());

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

Apply physics in sprite and other objects.
Basically, create physics area and apply it to an object.

Register listener

// For Physics
auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_1(GameScreen::onContactBegin, this);
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener, this);

These should be in init method

Create physics and apply

auto body = PhysicsBody::createCircle(playerSprite->getContentSize().width /2); // radius
body->setContactTestBitmask(true);
body->setDynamic(true);
playerSprite->setPhysicsBody(body);

onContactBegin

To handle collision in method, you need to implement onContactBegin

bool GameScene::onContactBegin(cocos2d::PhysicsContact& contact) {
        // Do something

        auto spriteA = (Sprite*)contact.getShapeA()->getBody()->getNode();
	auto spriteB = (Sprite*)contact.getShapeB()->getBody()->getNode();

        if (spriteA->getName().compare("A") == 0 && spriteB->getName().compare("B") == 0) {
        }

	return true;
}

Tips

Ignore actual collision

Go through

node->setDynamic(false);