标签:
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对象来生成真正的刚体Body
08.
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
b2ContactListener
01.
//碰撞事件回调函数
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.
}
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);
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);
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