标签:
01.//定义重力加速度02.b2Vec2 gravity;03.//设置垂直方向的重力加速度04.gravity.Set(0.0f, -9.8f);05./*使用刚刚定义好的重力加速度生成物理世界对象,06.这样世界中的所有对象都会受到重力加速度的影响*/07.b2World* phyWorld = new b2World(gravity);08.//物理世界的对象都参与碰撞检测,无休眠对象09.phyWorld->SetAllowSleeping(false);10.//连续碰撞检测,避免发生物体穿过另一个物体的事件11.phyWorld->SetContinuousPhysics(true);12.//设置碰撞监听器13.phyWorld->SetContactListener(listener);01.//首先生成b2BodyDef这个结构体的实例02.b2BodyDef spriteBodyDef;03.//指定刚体定义的类型是动态刚体,表明刚体是可以在物理世界中移动的04.spriteBodyDef.type = b2_dynamicBody;05.//设置刚体定义的初始位置06.spriteBodyDef.position.Set(5.0f,5.0f);07.//接下来使用spriteBodyDef对象来生成真正的刚体Body08.b2Body* spriteBody = phyWorld->CreateBody(&spriteBodyDef);09.//生成一个矩形形状,定义大小范围10.b2PolygonShape spriteShape;11.spriteShape.SetAsBox(10.0f, 10.0f);12.//接下来生成刚体Body将要使用的夹具对象13.b2FixtureDef spriteShapeDef;14.//指定夹具的外形就是刚刚生成的矩形15.spriteShapeDef.shape = &spriteShape;16.//设定其物理密度17.spriteShapeDef.density = 10.0f;18.//设定自己所属的碰撞组19.spriteShapeDef.filter.categoryBits = 0x0010;//第2组20.//指定自己会与哪个组发生碰撞21.spriteShapeDef.filter.maskBits = 0x0001;//第1组22.//使用定义好的夹具生成刚体23.spriteBody->CreateFixture(&spriteShapeDef);1.class World :public b2ContactListener01.//碰撞事件回调函数02.virtual void BeginContact(b2Contact* contact);03. 04.virtual void EndContact(b2Contact* contact)05.{06.B2_NOT_USED(contact);//关闭此事件,不做处理07.}08. 09.virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold)10.{11.B2_NOT_USED(contact);//关闭此事件,不做处理12.B2_NOT_USED(oldManifold);//关闭此事件,不做处理13.}14. 15.virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse)16.{17.B2_NOT_USED(contact);//关闭此事件,不做处理18.B2_NOT_USED(impulse);//关闭此事件,不做处理19.}
这样不论两个物体怎样运动,它们之间都会保持着固定的距离,就像使用一只杆子连接了这两个物体一样。距离连接器也可以变成软的,就像连接一个弹簧一样,在定义中通过调节频率(frequency)和阻尼率(damping ratio)两个常量来取得柔软的效果,以下是定义一个弹簧效果的距离连接器。
1.b2DistanceJointDef jointDef;2.jointDef.Initialize(body1, body2, body1->GetPosition(),body2->GetPosition());3.jointDef.collideConnected = true;4.jointDef.frequencyHz = 4.0f;5.jointDef.dampingRatio = 0.5f;6.jointDef.length = 10;7.phyWorld->CreateJoint(&jointDef);
定制一个旋转连接,我们需要在世界中提供两个刚体和一个简单的锚定点。初始化方法假设物体已经在正确的位置。在以下例子代码中,两个刚体通过旋转连接器以第一个物体的质心作为铰链点(hinge Point)连接在一起。当bodyB逆时针旋转的时候,转动连接器的角度为正值。就像Box2D中的所有其他角一样,旋转是以弧度为基准。一般来说,旋转连接器使用Initialize()方法创建完成之后,旋转连接器的角度为零,和两个物体当前的角度无关。在一些场合下你可以希望控制连接角(joint angle),以下代码给出了旋转连接器的建立和连接角的限制设定:
1.b2RevoluteJointDef jointDef;2.jointDef.Initialize(body1,body2, b2Vec2(body1->GetPosition().x-15,body1->GetPosition().y+15));3.jointDef.lowerAngle = -0.5 * b2_pi;4.jointDef.upperAngle = 0.25 * b2_pi;5.jointDef.enableLimit = true;6.phyWorld->CreateJoint(&jointDef);
qqGj0vK0y8a90sbBrL3T1rvT0NK7uPa3vc/yyc+1xNfU08m2yKGjCjxpbWcgc3JjPQ=="http://www.it165.net/uploadfile/files/2014/1229/20141229161044804.png" alt="\">
1.b2PrismaticJointDef jointDef;2.jointDef.Initialize(body1,body2,body2->GetPosition(), body2->GetPosition());3.jointDef.lowerTranslation = -100.0f;4.jointDef.upperTranslation = 100.0f;5.jointDef.enableLimit = true;6.phyWorld->CreateJoint(&jointDef);
debugDraw = new GLESDebugDraw();//这里新建一个debug渲染模块 phyWorld->SetDebugDraw(debugDraw);//设置 uint32 flags = 0; flags += b2Draw::e_shapeBit;//形状 flags += b2Draw::e_aabbBit;//AABB块 flags += b2Draw::e_centerOfMassBit;//物体质心 flags += b2Draw::e_jointBit;//关节 debugDraw->SetFlags(flags); scheduleUpdate();//每一帧都会调用一个叫update的方法,进行刷新屏幕
scheduleUpdate函数将会在每一帧中,调用一个update的方法。这个方法可以这么写:
1.void HelloWorld::update(float dt){2.phyWorld->Step(0.03f,10,10);3.}
标签:
原文地址:http://www.cnblogs.com/yyxt/p/4561410.html