cocos2d-x学习之路(12)--物理引擎box2d使用

来源:互联网 发布:菠萝饭软件评价 编辑:程序博客网 时间:2024/05/16 12:31

box2d是cocos2d-x中的一款物理引擎,通过box2d可以方便的构件一个物理世界,并给世界中的物体添加物理属性

为了测试物理引擎的使用,在之前的TestLayer中继续进行代码编写

要使用box2d,首先要创建世界

//获取屏幕大小
 CCSize winSize=CCDirector::sharedDirector()->getWinSize();
 //创建一个物理世界,需要定义一个重力进行初始化
 b2Vec2 gravity;
 gravity.Set(0.0f, -10.0f);//重力设置为10
 bool doSleep = true; 
 m_world = new b2World(gravity);

//允许刚体睡眠
 m_world->SetAllowSleeping(doSleep);
 m_world->SetContinuousPhysics(true);

创建一个刚体并用刚体形状包围屏幕的四个边,使得屏幕四边具有物理属性

b2BodyDef groudBodyDef;
 b2Body * groudBody=m_world->CreateBody(&groudBodyDef);

 b2PolygonShape groudBox;
 groudBox.SetAsBox(winSize.width/PTM_RATIO,0,b2Vec2(0,0),0);                              //底边
 groudBody->CreateFixture(&groudBox,0);                                                                     //关联到刚体
 groudBox.SetAsBox(winSize.width/PTM_RATIO,0,b2Vec2(0,winSize.height/PTM_RATIO),0);               //顶边
 groudBody->CreateFixture(&groudBox,0);
 groudBox.SetAsBox(0,winSize.height/PTM_RATIO,b2Vec2(0,0),0);                                             //左边
 groudBody->CreateFixture(&groudBox,0);
 groudBox.SetAsBox(0,winSize.height/PTM_RATIO,b2Vec2(winSize.width/PTM_RATIO,0),0);          //右边
 groudBody->CreateFixture(&groudBox,0);

创建一个刚体包含已经创建好的精灵
 b2Body * _Body;
 b2BodyDef paddleBodyDef;
 paddleBodyDef.type = b2_dynamicBody;                 //创建动态刚体,即具有物理属性的刚体
 paddleBodyDef.position.Set(winSize.width/2/PTM_RATIO, winSize.height/2/PTM_RATIO);       //设置刚体位置
 paddleBodyDef.userData = m_sprite;                                                             //包含精灵
 _Body = m_world->CreateBody(&paddleBodyDef);

设置刚体形状和属性

b2PolygonShape dynamicBox;
 dynamicBox.SetAsBox(0.5f,0.5f);              
 b2FixtureDef fixtureDef;
 fixtureDef.shape=&dynamicBox;
 //密度
 fixtureDef.density=1.0f;
 //摩擦因子
 fixtureDef.friction=0.3f;
 //弹力系数
 fixtureDef.restitution=0.5;
 _Body->CreateFixture(&fixtureDef);

最后在定时器中遍历世界中的刚体,更新刚体的坐标,box2d通过定期调用 step来更新动画

void TestLayer::update(float delta){//速度迭代次数和位置迭代次数
int velocityIterations = 8;   int positionIterations = 1;m_world->Step(0.03, velocityIterations, positionIterations);for (b2Body* b = m_world->GetBodyList(); b; b = b->GetNext()){if (b->GetUserData() != NULL) {CCSprite* myActor = (CCSprite*)b->GetUserData();myActor->setPosition( CCPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO) );myActor->setRotation( -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()) );}}}


 

在GameScene::update中调用 TestPlayer对象的update

 

运行程序后,可以看到Hero从空中落下,在碰到底边后弹起,再落下,反复几次之后停在底边的情形

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网易邮箱字体变小了怎么办 邮箱注册不了全拼怎么办 家用电器接入两相火线后怎么办 手机充电板坏了怎么办 闪电宝商户乱跳怎么办 网易邮箱发错了怎么办 苹果手机邮件无法连接服务器怎么办 好记星平板电脑开不了机怎么办 邮箱里的文件过期了怎么办 小米手机邮件发不了怎么办 有人加我qq邮箱怎么办 文件太大发邮件太慢怎么办 爱又米发信息怎么办 手机上电子邮件己停止运行怎么办 苹果电子邮件密码忘了怎么办 玩游戏时电脑烫怎么办 qq邮箱独立密码忘记了怎么办 qq邮箱中转站容量不足怎么办 qq邮箱忘记密码了怎么办 qq邮箱超大附件过期怎么办 忘记qq邮箱独立密码怎么办 网易邮箱账号忘了怎么办 微信登录密码忘了怎么办 微信太久没登录登录不上怎么办 邮箱独立密码忘记了怎么办 苹果设置id没有邮箱怎么办 苹果手机设置id没有邮箱怎么办 邮箱的附件过期了怎么办 邮箱里的附件过期了怎么办 邮箱中附件过期了怎么办 扣扣邮箱附件过期怎么办 公司网页版邮箱进不去了怎么办 农行客户端密码忘记了怎么办 中国银行客户端密码忘记了怎么办 建行客户端登录密码忘记了怎么办 中国移动客户端密码忘记了怎么办 再歪一点授权码绑定怎么办 网易邮箱号忘了怎么办 忘记支付宝账号和密码怎么办 支付宝账号密码忘了怎么办 发邮箱文件超2g怎么办