当前位置 : 主页 > 手机开发 > 其它 >

cocos2d-x 物理引擎

来源:互联网 收集:自由互联 发布时间:2021-06-13
当你的需求很简单时,就不要使用物理引擎,比如只需要确定两个对象是否碰撞,结合使用节点对象的update函数和Rect对象的containsPoint(),intersectRect()方法可能就足够了。 void update(floa

当你的需求很简单时,就不要使用物理引擎,比如只需要确定两个对象是否碰撞,结合使用节点对象的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

}
网友评论