cocos 物理碰撞和触发事件

#include "HelloWorldScene.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"

USING_NS_CC;

using namespace cocostudio::timeline;

Scene* HelloWorld::createScene()
{
	auto scene = Scene::createWithPhysics();
    
	scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//开启线框调试模式

	scene->getPhysicsWorld()->setAutoStep(false);

    auto layer = HelloWorld::create();

	PhysicsBody* body = PhysicsBody::createEdgeBox(Director::getInstance()->getWinSizeInPixels()*0.9);

	body->setCategoryBitmask(0x3);

	body->setCollisionBitmask(0x3);

	body->setContactTestBitmask(0x3);
	//Todo 2、body
	layer->setPhysicsBody(body);

    scene->addChild(layer);

    return scene;
}
bool HelloWorld::init()
{
	scheduleUpdate();
    if ( !Layer::init() )
    {
        return false;
    }
	setTouchEnabled(true);

	setTouchMode(Touch::DispatchMode::ONE_BY_ONE);

    rootNode = CSLoader::createNode("MainScene.csb");

	sprite = rootNode->getChildByName("Sprite_1");

	PhysicsBody* body = PhysicsBody::createBox(sprite->getContentSize());

	PhysicsBody* bodyCircle = PhysicsBody::createCircle(sprite->getContentSize().width/2);


	//掩码 100001000 A
	//     000001000 B
	//按位与 >0 A拥有B的特征
	bodyCircle->setCategoryBitmask(0x2);//Category类别掩码

	bodyCircle->setCollisionBitmask(0x2);//Collision碰撞掩码

	bodyCircle->setContactTestBitmask(0x1);//ContactTest连接掩码,触碰触发事件需要设置
	//Todo 1、bodyCircle

	bodyCircle->setDynamic(true);//true使用物理模拟,false反物理模拟,反运动运动学

	bodyCircle->setGravityEnable(true);//重力

	bodyCircle->setName("bird");

	sprite->setPhysicsBody(bodyCircle);

	sprite->getPhysicsBody()->setMass(0.5f);

	//碰撞检测事件 全局检测 
	 physicsContact = EventListenerPhysicsContact::create();//物理连接事件

	physicsContact->onContactBegin = CC_CALLBACK_1(HelloWorld::onCollsionEnter,this);

	getEventDispatcher()->addEventListenerWithSceneGraphPriority(physicsContact, rootNode);

    addChild(rootNode);

    return true;
}

void HelloWorld::update(float dt)
{
	for (int i = 0; i < 3; i++)
	{
		this->getScene()->getPhysicsWorld()->step(1 / 180.0f);
	}
}

bool HelloWorld::onTouchBegan(Touch * touch, Event * unused_event)
{
	//克隆
	Sprite* clone = Sprite::createWithTexture(sprite->getTexture());

	PhysicsBody* bodyClone = PhysicsBody::createBox(clone->getContentSize());

	bodyClone->setCategoryBitmask(0x1);

	bodyClone->setCollisionBitmask(0x1);

	bodyClone->setContactTestBitmask(0x2);

	bodyClone->setMass(sprite->getPhysicsBody()->getMass());

	bodyClone->setDynamic(true);

	bodyClone->setGravityEnable(true);

	bodyClone->setName("clone");

	//body->setCategoryBitmask(6);

	//body->setCollisionBitmask(3);

	//body->setContactTestBitmask(1);

	clone->setPhysicsBody(bodyClone);

	clone->setPosition(touch->getLocation());

	this->addChild(clone);

	return true;
}

bool HelloWorld::onContactBegin(PhysicsContact & contact)
{
	return true;
}

bool HelloWorld::onCollsionEnter(PhysicsContact & contact)
{
	//碰撞物体类型
	std :: string bodyA = contact.getShapeA()->getBody()->getName();

	std :: string bodyB  = contact.getShapeB()->getBody()->getName();

	if (bodyA == "bird")
	{
		contact.getShapeA()->getBody()->getOwner()->setVisible(false);

		contact.getShapeA()->getBody()->setEnabled(false);//关闭刚体
	}

	else if (bodyB == "clone")
	{
		contact.getShapeB()->getBody()->getOwner()->setVisible(false);

		contact.getShapeB()->getBody()->setEnabled(false);//关闭刚体
	}
	return true;
}

 

你可能感兴趣的:(cocos2d)