当你的需求很简单时,就不要使用物理引擎,比如只需要确定两个对象是否碰撞,结合使用节点对象的update函数和Rect对象的containsPoint(),intersectRect()方法可能就足够了。
void update(float dt) { auto p = touch->getLocation(); auto rect = this->getBoundingBox(); if(rect.containsPoint(p)) { // do something,intersection } }
// create a static PhysicsBody auto physicsBody = PhysicsBody::createBox(Size(65.0f,81.0f ),PhysicsMaterial(0.1f,1.0f,0.0f)); physicsBody->setDynamic(false); // create a sprite auto sprite = Sprite::create("whiteSprite.png"); sprite->setPosition(Vec2(400,400)); // sprite will use physicsBody sprite->addComponent(physicsBody); //add contact event listener auto contactListener = EventListenerPhysicsContact::create(); contactListener->onContactBegin = CC_CALLBACK_1(onContactBegin,this); _eventDispatcher->addEventListenerWithSceneGraPHPriority(contactListener,this);
上面的例子代码流程:
(1)PhysicsBody对象创建
(2)Sprite对象创建
(3)PhysicsBody对象以组件的形式被添加到Sprite对象
(4)创建监听器以响应onContactBegin()事件
刚体(Bodies)
刚体描述了抽象物体的物理属性,包括:质量、位置、旋转角度、速度和阻尼。Cocos2d-x用PhysicsBody对象表示刚体。当刚体和形状关联后,刚体对角才具有几何形状,未关联形体,刚体只是一个抽象物体的物理属性集。
材质(Material)
材质描述了抽象物体的材料属性:
(1)density:密度,用于计算物体的质量
(2)friction:摩擦,用于模拟物体间的接触滑动。
(3)restitution:恢复系数,模拟物体反弹的一个系数,一般设为0到1之间,0代表不反弹,1代表完全反弹。
形状(Shape)
形状描述了抽象物体的几何属性,将形状关联到刚体,刚体才具有几何形状。如果需要刚体具有复杂的形状,可以为它关联多个形状,每个形状对象都与一个PhysicsMaterial相关,并且拥有以下属性
(1)type:描述了形状的类别,如圆形、矩形等。
(2)area:用于计算刚体的质量,密度和面积决定了刚体的质量。
(3)mass:刚体的质量,影响物体在给定的力下获得的加速度大小。
(4)moment:刚体获得特定角加速度所需要的扭矩
(5)offset:在刚体的当前坐标中,相对于刚体重心的偏移量
(6)tag:形状对象的一个标签
连接/关节
连接(Contacts)和关节(joint)对象描述了刚体相互关联的方式。
刚体连接了不同的刚体,刚体可以是静态的,每个关节类都是PhysicsJoint的子类,你可以通过设置joint->setCollisionEnable(false)来避免相互关联的刚体互相碰撞。
世界(World)
世界是现实物理世界的一个游戏模拟,容纳着所有被添加进去的抽象物体,你可以将刚体、形状、约束都添加到物理世界中,然后将整个世界作为一个整体进行更新。
PhysicsWorld
物理世界PhysicsWorld与场景(Scene)进行了深入的整合,只需要调用Scene对象的initWithPhysics()方法,就可以创建一个包含物理世界的场景,注意在初始化的时候要进行函数返回值的判断。初始化成功返回true,失败返回false。
(1)gravity:全局重力,默认值为Vec2(0.0f,-98.0f)
(2)speed:物理世界的速度,这里的速度指的是这个模拟世界运行的一种比率,默认值是1.0
(3)updateRate:物理世界的刷新率,这里的刷新率指的是游戏引擎刷新时间与物理世界刷新时间的比值。
(4)substeps:物理世界中每次刷新的子步数量。
物理刚体(PhysicsBody)
具有位置和速度,你可以在物理刚体上应用力(forces)、运动(movement)、阻尼(damping)、冲量(impulses)等。
碰撞
碰撞筛选
碰撞筛选允许你启用或者阻止形状之间碰撞的发生,引擎支持使用类型,组位掩码来进行碰撞筛选。
Cocos2d-x有32个支持的碰撞类型,对于每个形状都可以指定其所属的类型。还可以指定有哪些类型可以与这个形状进行碰撞,这些都是通过掩码来完成的。
auto sprite1 = addSpriteAtPosition(Vec2(s_centre.x - 150,s_centre.y)); sprite1->getPhysicsBody()->setCategoryBitmask(0x02); // 0010 sprite1->getPhysicsBody()->setCollisionBitmask(0x01); // 0001 sprite1 = addSpriteAtPosition(Vec2(s_centre.x - 150,s_centre.y + 100)); sprite1->getPhysicsBody()->setCategoryBitmask(0x02); // 0010 sprite1->getPhysicsBody()->setCollisionBitmask(0x01); // 0001 auto sprite2 = addSpriteAtPosition(Vec2(s_centre.x + 150,s_centre.y),1); sprite2->getPhysicsBody()->setCategoryBitmask(0x01); // 0001 sprite2->getPhysicsBody()->setCollisionBitmask(0x02); // 0010 auto sprite3 = addSpriteAtPosition(Vec2(s_centre.x + 150,s_centre.y + 100),2); sprite3->getPhysicsBody()->setCategoryBitmask(0x03); // 0011 sprite3->getPhysicsBody()->setCollisionBitmask(0x03); // 0011 }