#include "cocos2d.h"
USING_NS_CC;
class HelloWorld : public cocos2d::Layer
{
public:
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::Scene* createScene();
Sprite* ball;
PhysicsWorld* m_world;
void setPhyWorld(PhysicsWorld* world) {m_world = world;}
bool onContactBegin(const PhysicsContact& contact);
virtual bool init();
Sprite* ballOne;
Sprite* ballTwo;
CREATE_FUNC(HelloWorld);
};
#include "HelloWorldScene.h"
USING_NS_CC;
int ball1Mask = 1 << 0;
int ball2Mask = 1 << 1;
int wallMask = 1 << 2;
Scene* HelloWorld::createScene()
{
//创建有物理空间的场景
auto scene = Scene::createWithPhysics();
//这事debug模式,使物体表面被线条保卫,主要是为了在调试中方便观察
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
//创建Layer层
auto layer = HelloWorld::create();
//把空间保持我们创建的层中
layer->setPhyWorld(scene->getPhysicsWorld());
scene->addChild(layer);
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//
// 1. super init first
if ( !Layer::init() )
{
return false;
}
//添加事件监听
auto contactListener = EventListenerPhysicsContact::create();
//设置回调函数
contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,this);
//添加到事件分发器中
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener, this);
auto winSize = Director::getInstance()->getWinSize();
ballOne = Sprite::create();
ballOne->setContentSize(Size(50,50));
ballOne->setPosition(Vec2(winSize.width/2,winSize.height/2));
//创建物体,并且物体的形状为圆形,参数1为半径,参数2为物体材质,参数三为物体边缘厚度,即Debug模式下看到的物体外面线条的厚度,默认为0;
PhysicsBody* ballBodyOne = PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT,Vec2(1,1));
//设置物体恢复力
ballBodyOne->getShape(0)->setRestitution(1.0f);
//设置物体摩擦力
ballBodyOne->getShape(0)->setFriction(0.0f);
//设置物体密度
ballBodyOne->getShape(0)->setDensity(1.0f);
//设置物体是否受重力系数影响
ballBodyOne->setGravityEnable(false);
//设置物体的冲力
Vect force = Vect(500000.0f,500000.0f);
ballBodyOne->applyImpulse(force);
//将物体加入精灵中
ballOne->setPhysicsBody(ballBodyOne);
ballOne->setTag(1);
addChild(ballOne);
//设置第二个球
ballTwo = Sprite::create();
ballTwo->setContentSize(Size(100,100));
ballTwo->setPosition(Vec2(winSize.width/3,winSize.height/3));
PhysicsBody* ballBodyTwo = PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT);
ballBodyTwo->getShape(0)->setRestitution(1.0f);
ballBodyTwo->getShape(0)->setFriction(0.0f);
ballBodyTwo->getShape(0)->setDensity(1.0f);
ballBodyTwo->setGravityEnable(false);
force = Vect(-500000.0f,-500000.0f);
ballBodyTwo->applyImpulse(force);
ballTwo->setPhysicsBody(ballBodyTwo);
ballTwo->setTag(2);
addChild(ballTwo);
//创建容器,用来碰撞
Sprite* edgeSpace = Sprite::create();
//设置盒子属性
PhysicsBody* boundBody = PhysicsBody::createEdgeBox(winSize,PHYSICSBODY_MATERIAL_DEFAULT,3);
boundBody->getShape(0)->setFriction(0.0f);//摩擦力
boundBody->getShape(0)->setRestitution(1.0f);//恢复力
edgeSpace->setPhysicsBody(boundBody);//将物体加入盒子
edgeSpace->setPosition(Vec2(winSize.width/2,winSize.height/2));
addChild(edgeSpace);
edgeSpace->setTag(0);
//碰撞检测
ballBodyOne->setCategoryBitmask(ball1Mask);
ballBodyOne->setCollisionBitmask(wallMask|ball1Mask|ball2Mask);
ballBodyOne->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);
ballBodyTwo->setCategoryBitmask(ball2Mask);
ballBodyTwo->setCollisionBitmask(wallMask|ball1Mask|ball2Mask);
ballBodyTwo->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);
boundBody->setCategoryBitmask(wallMask);
boundBody->setCollisionBitmask(wallMask|ball1Mask|ball2Mask);
boundBody->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);
return true;
}
bool HelloWorld::onContactBegin(const cocos2d::PhysicsContact &contact)
{
if((contact.getShapeA()->getBody()->getCategoryBitmask() & ball1Mask) == ball1Mask)
{
log("ball1 touch something");
}
if((contact.getShapeB()->getBody()->getCategoryBitmask() & ball1Mask) == ball1Mask)
{
log("ball1 touch something");
}
if((contact.getShapeA()->getBody()->getCategoryBitmask() & ball2Mask) == ball2Mask)
{
log("ball2 touch something");
}
if((contact.getShapeB()->getBody()->getCategoryBitmask() & ball2Mask) == ball2Mask)
{
log("ball2 touch something");
}
return true;
}