cocos2d-x 物理引擎

时间:2022-04-23 04:56:12

场景创建:

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);

 先记录,回去整理:

http://cn.cocos2d-x.org/tutorial/show?id=1376