[ IOS-Cocos2d-x (Box2d)游戏开发之一] -简单创建一个Box2D



简单创建一个Box2D


ps:最简单一个box2d例子


第一步,构建一个物理世界。

[java]  view plain copy
  1. b2Vec2 gravity;  
  2. gravity.Set(0.0f,-10.0f);//物理世界的重力(垂直向下掉落)  
  3.           
  4. world = new b2World(gravity,true);//创建世界对象,true参数表示刚体可以进入睡眠模式  
b2Vec2相当于cocos2d中的CGPoint,用于表示一个点。


看一下b2World的构造函数:

[java]  view plain copy
  1. b2World::b2World(const b2Vec2& gravity, bool doSleep)  
  2. {  
  3.     m_destructionListener = NULL;  
  4.     m_debugDraw = NULL;  
  5.   
  6.     m_bodyList = NULL;//初始化刚体列表  
  7.     m_jointList = NULL;//初始化关节列表  
  8.   
  9.     m_bodyCount = 0;//世界中刚体的数量  
  10.     m_jointCount = 0;  
  11.   
  12.     m_warmStarting = true;  
  13.     m_continuousPhysics = true;  
  14.   
  15.     m_allowSleep = doSleep;//运动过慢的刚体 是否进入睡眠模式  
  16.     m_gravity = gravity;  
  17.   
  18.     m_flags = e_clearForces;  
  19.   
  20.     m_inv_dt0 = 0.0f;  
  21.   
  22.     m_contactManager.m_allocator = &m_blockAllocator;  
  23. }  
它初始化了数据然后返回一个b2World对象。


到这里,物理世界已经创建完毕了,可是这个世界是没有边界的,也就是说刚体可能会跳出手机屏幕之外。

只要给物理世界加4条边缘就可以了:

[java]  view plain copy
  1. b2PolygonShape worldShape;  
  2.   
  3. // bottom  
  4. worldShape.SetAsEdge(b2Vec2(0,0), b2Vec2(screenSize.width/PTM_RATIO,0));  
  5. worldBody->CreateFixture(&worldShape,0);  
  6.           
  7. // top  
  8. worldShape.SetAsEdge(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO));  
  9. worldBody->CreateFixture(&worldShape,0);  
  10.           
  11. // left  
  12. worldShape.SetAsEdge(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(0,0));  
  13. worldBody->CreateFixture(&worldShape,0);  
  14.           
  15. // right  
  16. worldShape.SetAsEdge(b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,0));  
  17. worldBody->CreateFixture(&worldShape,0);  
在CreateFixture函数中,通过以下代码把刚体和形状关联到一起:

[java]  view plain copy
  1. b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def)  
  2. {  
  3.     ...  
  4.     fixture->m_body = this;  
  5.     ...  
  6. }  

第二步,向世界中加入刚体:

[java]  view plain copy
  1. b2BodyDef bodyDef;  
  2. bodyDef.type = b2_dynamicBody;//默认是静态刚体  
  3. bodyDef.position.Set(touchPoint.x/PTM_RATIO,touchPoint.y/PTM_RATIO);  
  4. b2Body *body = world->CreateBody(&bodyDef);  
CreateBody函数就是把bodyDef的内容拷贝到Body里,看看它的实现把:

[java]  view plain copy
  1. b2Body* b2World::CreateBody(const b2BodyDef* def)  
  2. {  
  3.     ...  
  4.     b2Body* b = new (mem) b2Body(def, this);  
  5.     m_bodyList = b;//把刚体保存到刚体列表  
  6.     ++m_bodyCount;  
  7.     ...  
  8. }  

设置形状、摩擦力、密度:

[java]  view plain copy
  1. b2PolygonShape shape;  
  2. shape.SetAsBox(0.5f,0.5f);  
  3.       
  4. b2FixtureDef fixtureDef;  
  5. fixtureDef.shape = &shape;    
  6. fixtureDef.density = 1.0f;  
  7. fixtureDef.friction = 0.3f;  
  8. body->CreateFixture(&fixtureDef);  

第三步,更新物理世界:

在init中加入:

[java]  view plain copy
  1. [self scheduleUpdate];  
然后实现update函数:

[java]  view plain copy
  1. - (void)update:(ccTime)dt{  
  2.   
  3.     int32 velocityIterations = 8;  
  4.     int32 positionIterations = 1;  
  5.       
  6.     world->Step(dt, velocityIterations, positionIterations);  
  7.       
  8.     for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {  
  9.         if (b->GetUserData() != NULL) {  
  10.             CCSprite *spr = (CCSprite *)b->GetUserData();  
  11.             float x = b->GetPosition().x;  
  12.             float y = b->GetPosition().y;  
  13.             spr.position = ccp(x*PTM_RATIO,y*PTM_RATIO);  
  14.             spr.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());  
  15.         }  
  16.     }  
  17. }  

简单创建一个Box2D


第一步,构建一个物理世界。

[java]  view plain copy
  1. b2Vec2 gravity;  
  2. gravity.Set(0.0f,-10.0f);//物理世界的重力(垂直向下掉落)  
  3.           
  4. world = new b2World(gravity,true);//创建世界对象,true参数表示刚体可以进入睡眠模式  
b2Vec2相当于cocos2d中的CGPoint,用于表示一个点。


看一下b2World的构造函数:

[java]  view plain copy
  1. b2World::b2World(const b2Vec2& gravity, bool doSleep)  
  2. {  
  3.     m_destructionListener = NULL;  
  4.     m_debugDraw = NULL;  
  5.   
  6.     m_bodyList = NULL;//初始化刚体列表  
  7.     m_jointList = NULL;//初始化关节列表  
  8.   
  9.     m_bodyCount = 0;//世界中刚体的数量  
  10.     m_jointCount = 0;  
  11.   
  12.     m_warmStarting = true;  
  13.     m_continuousPhysics = true;  
  14.   
  15.     m_allowSleep = doSleep;//运动过慢的刚体 是否进入睡眠模式  
  16.     m_gravity = gravity;  
  17.   
  18.     m_flags = e_clearForces;  
  19.   
  20.     m_inv_dt0 = 0.0f;  
  21.   
  22.     m_contactManager.m_allocator = &m_blockAllocator;  
  23. }  
它初始化了数据然后返回一个b2World对象。


到这里,物理世界已经创建完毕了,可是这个世界是没有边界的,也就是说刚体可能会跳出手机屏幕之外。

只要给物理世界加4条边缘就可以了:

[java]  view plain copy
  1. b2PolygonShape worldShape;  
  2.   
  3. // bottom  
  4. worldShape.SetAsEdge(b2Vec2(0,0), b2Vec2(screenSize.width/PTM_RATIO,0));  
  5. worldBody->CreateFixture(&worldShape,0);  
  6.           
  7. // top  
  8. worldShape.SetAsEdge(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO));  
  9. worldBody->CreateFixture(&worldShape,0);  
  10.           
  11. // left  
  12. worldShape.SetAsEdge(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(0,0));  
  13. worldBody->CreateFixture(&worldShape,0);  
  14.           
  15. // right  
  16. worldShape.SetAsEdge(b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,0));  
  17. worldBody->CreateFixture(&worldShape,0);  
在CreateFixture函数中,通过以下代码把刚体和形状关联到一起:

[java]  view plain copy
  1. b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def)  
  2. {  
  3.     ...  
  4.     fixture->m_body = this;  
  5.     ...  
  6. }  

第二步,向世界中加入刚体:

[java]  view plain copy
  1. b2BodyDef bodyDef;  
  2. bodyDef.type = b2_dynamicBody;//默认是静态刚体  
  3. bodyDef.position.Set(touchPoint.x/PTM_RATIO,touchPoint.y/PTM_RATIO);  
  4. b2Body *body = world->CreateBody(&bodyDef);  
CreateBody函数就是把bodyDef的内容拷贝到Body里,看看它的实现把:

[java]  view plain copy
  1. b2Body* b2World::CreateBody(const b2BodyDef* def)  
  2. {  
  3.     ...  
  4.     b2Body* b = new (mem) b2Body(def, this);  
  5.     m_bodyList = b;//把刚体保存到刚体列表  
  6.     ++m_bodyCount;  
  7.     ...  
  8. }  

设置形状、摩擦力、密度:

[java]  view plain copy
  1. b2PolygonShape shape;  
  2. shape.SetAsBox(0.5f,0.5f);  
  3.       
  4. b2FixtureDef fixtureDef;  
  5. fixtureDef.shape = &shape;    
  6. fixtureDef.density = 1.0f;  
  7. fixtureDef.friction = 0.3f;  
  8. body->CreateFixture(&fixtureDef);  

第三步,更新物理世界:

在init中加入:

[java]  view plain copy
  1. [self scheduleUpdate];  
然后实现update函数:

[java]  view plain copy
  1. - (void)update:(ccTime)dt{  
  2.   
  3.     int32 velocityIterations = 8;  
  4.     int32 positionIterations = 1;  
  5.       
  6.     world->Step(dt, velocityIterations, positionIterations);  
  7.       
  8.     for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {  
  9.         if (b->GetUserData() != NULL) {  
  10.             CCSprite *spr = (CCSprite *)b->GetUserData();  
  11.             float x = b->GetPosition().x;  
  12.             float y = b->GetPosition().y;  
  13.             spr.position = ccp(x*PTM_RATIO,y*PTM_RATIO);  
  14.             spr.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());  
  15.         }  
  16.     }  
  17. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值