创建物理场景:
重写createScene
Scene@H_502_7@* HelloWorld::createScene()
{
auto scene @H_502_7@= Scene::createWithPhysics();
scene@H_502_7@->getPhysicsWorld()@H_502_7@->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); //显示调试信息
scene@H_502_7@->getPhysicsWorld()@H_502_7@->setGravity(Vec2(0.0,@H_502_7@-100.0)); //设置重力
auto layer @H_502_7@= HelloWorld::create();
scene@H_502_7@->addChild(layer);
return scene;
}
Node@H_502_7@* HelloWorld::addEdges()
{
//创建 body ,visibleSize表示body的大小, PhysicsMaterial表示材质,3表示边框的厚度
auto body @H_502_7@= PhysicsBody::createEdgeBox(visibleSize,PhysicsMaterial(1,1,0),3);
body@H_502_7@->setCategoryBitmask(4); //设置分类掩码
body@H_502_7@->setContactTestBitmask(1 @H_502_7@| 2 @H_502_7@| 4); //设置接触掩码
body@H_502_7@->setCollisionBitmask(1 @H_502_7@| 2 @H_502_7@| 4); //设置碰撞掩码
auto edges @H_502_7@= Node::create(); //创建Node
edges@H_502_7@->setPhysicsBody(body); //设置节点的body
edges@H_502_7@->setPosition(visibleSize @H_502_7@/ 2); //居中
this@H_502_7@->addChild(edges);
return edges;
}
Sprite@H_502_7@* HelloWorld::addBox(Vec2 position)
{
PhysicsBody@H_502_7@* body;
auto Box @H_502_7@= Sprite::create();
switch (random(0,1))
{
case 0:
Box@H_502_7@->initWithFile("red.png"); //设置精灵图片
body @H_502_7@= PhysicsBody::createCircle(Box@H_502_7@->getContentSize().width @H_502_7@/ 2); //创建圆形body
body@H_502_7@->setCategoryBitmask(1); //设置分类掩码
body@H_502_7@->setContactTestBitmask(1 @H_502_7@| 2 @H_502_7@| 4); //设置接触掩码
body@H_502_7@->setCollisionBitmask(1 @H_502_7@| 2 @H_502_7@| 4); //设置碰撞掩码
Box@H_502_7@->setPhysicsBody(body); //设置精灵的body
Box@H_502_7@->setPosition(position); //设置位置
this@H_502_7@->addChild(Box);
break;
case 1:
Box@H_502_7@->initWithFile("yellow.png");//设置精灵图片
body @H_502_7@= PhysicsBody::createCircle(Box@H_502_7@->getContentSize().width @H_502_7@/ 2);
body@H_502_7@->setCategoryBitmask(2); //设置分类掩码
body@H_502_7@->setContactTestBitmask(1 @H_502_7@| 2 @H_502_7@| 4); //设置接触掩码
body@H_502_7@->setCollisionBitmask(1 @H_502_7@| 2 @H_502_7@| 4); //设置碰撞掩码
Box@H_502_7@->setPhysicsBody(body); //设置精灵的body
Box@H_502_7@->setPosition(position); //设置位置
this@H_502_7@->addChild(Box);
break;
default:
break;
}
return Box;
}
创建事件侦听器:
//刚开始碰撞触发一次
contactListener->onContactBegin = [](PhysicsContact& contact){
//.........
return true; //下面解释返回值
};
//接触就会一直触发
contactListener->onContactPreSolve = [](PhysicsContact& contact,PhysicsContactPreSolve& solve){
//.........
return true; //下面解释返回值
};
首先解释CategoryBitmask, ContactTestBitmask, CollisionBitmask 三个代表含义,
CategoryBitmask: 分类掩码
ContactTestBitmask : 接触掩码
CollisionBitmask: 碰撞掩码
它们的作用如下:
当两个物体 A 和 B 碰撞后