#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*>("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;
}