场景创建:
1 auto scene = Scene::createWithPhysics(); // 创建一个物理引擎世界场景
获取物理引擎世界对象:
1 getPhysicsWorld(); //获取初始化的物理世界(PhysicsWorld)对象
设置在物理世界中绘制调试遮罩:
1 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL)
把物体的形状绘制出来,物理世界中的物体,如果没有和精灵绑定在一起,我们是看不到它的,这个功能主要用于调试。如果发布,需要关闭该功能。
世界边界:
1 //定义世界的边界 2 auto body = PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,5.0f);
3 auto edgeNode = Node::create(); // 创建边界节点对象,这个节点对象作为世界边界对象
4 edgeNode->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2)); // 设置节点对象的位置
5 edgeNode->setPhysicsBody(body); // 设置与节点相关的物体对象,通过这条语句使得游戏场景中的节点对象(精灵等)与物体关联起来
6 this->addChild(edgeNode); // 将节点对象添加到层中
1 1 PhysicsBody::createEdgeBox(const Size& size, const PhysicsMaterial& material = PHYSICSBODY_MATERIAL_DEFAULT 2 , float border = 1, const Vec2& offset = Vec2::ZERO) // 创建一个矩形边界物体对象 3 参数说明: 4 size:指定矩形的大小 5 material:设置材质,PHYSICSBODY_MATERIAL_DEFAULT常量是默认材质,材质是由结构体PhysicsMaterial定义的, 6 结构体PhysicsMaterial成员有:density(密度)、friction(磨擦系数)和restitution(弹性系数)。 7 密度可以用来计算物体的质量,密度可以为零或者为正数。 8 摩擦系数经常会设置在0.0~1.0之间,0.0表示没有摩擦力,1.0会产生强摩擦。 9 弹性系数的值通常设置到0.0~1.0之间,0.0表示物体不会弹起,1.0表示物体会完全反弹,即称为弹性碰撞。 10 border:设置边的宽度。
1 1 auto sp = Sprite::create(Ball.png); // 创建一个精灵对象 2 2 sp->setTag(1); // 设置精灵的tag属性,在检查碰撞时候可以通过tag属性判断并获得精灵对象。 3 3 auto body = PhysicsBody::createCircle(sp->getContentSize().width / 2); // 通过PhysicsBody的静态createCircle函数创建圆圈形状物体 4 4 //auto body = PhysicsBody::createBox(sp->getContentSize()); // 创建一个没有边的矩形盒子 5 5 sp->setPhysicsBody(body); // 设置与精灵相关的物体对象 6 6 sp->setPosition(p); 7 7 this->addChild(sp);
碰撞检测:
/* 创建监听器对象 */
auto contactListener = EventListenerPhysicsContact::create();
/* 设置onContactBegin回调函数为onContactBegin 开始碰撞调用 */
contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,
this
);
/* 设置onContactSeperate回调函数为onContactSeperate 结束碰撞调用 */
contactListener->onContactSeperate=CC_CALLBACK_1(HelloWorld::onContactSeperate,
this
);
/* 设置监听 最后在释放函数中不要忘记取消注册 */
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener,
this
);
## 警告:
必须给需要检查碰撞的刚体添加一下代码:
Body->setMass(1.0f);
Body->setContactTestBitmask(0xFFFFFFFF);
Body->setContactTestBitmask(0xFFFFFFFF);
先记录,回去整理: