Cocos2d-x学习笔记_Box2d物理引擎1

前端之家收集整理的这篇文章主要介绍了Cocos2d-x学习笔记_Box2d物理引擎1前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

如果只是对坐标的移动、持续改变位置,我们完全可以通过计划任务或者递归来解决

如果涉及对物理世界中移动、碰撞等属性较为逼真的模拟,我们需要借助物理引擎的帮助。

世界、刚体、夹具、监听

----------------------------------------------------------------------

#include ''Box2d/Box2d.h''

设置世界的属性

b2Vec2 gravite;

gravite.Set(0.0f,-9.8f);//标准物理世界重力


创建物理世界

b2World *world=new b2World(gravite);


设置刚体夹具

b2PolygonShape bodyshape;

bodyshape.SetAsBos(50/32,50/32);


设置初始状态

b2BodyDef bodydef;

bodydef.type=b2_staticBody;

bodydef.position.Set(0.0f,10/32.0f);


设置刚体属性

b2FixtureDef fixdef;

fixdef.shape=&shape;

fixdef.density=1.0;//密度

fixdef.friction=0.3;//摩擦力

fixdef.restitution=0.5;//恢复系数


创建刚体

b2Body *body=world->CreateBody(&bodydef);

body->CreateFixture(&fixdef);


//物理引擎只是对数据的模拟,还需要通过精灵将模拟的结果实时的显示到屏幕上。

Sprite *sp=Sprite::create("xxx.png");

body->SetUserData(sp);


//既然物理引擎是一个持续的模拟的行为,那么需要计划任务执行物理引擎的模拟

//在init()方法中加入,该计划任务默认调用Updata方法

this->scheduleUpdate();


void HelloWorld::Update(float t)

{

world->Step(t,8,3);

for(b2Body *b=world->GetBodyList();b!=NULL;b=b->next)

{

auto sp=(Sprite*)b->GetUserData();

if(sp!=NULL)

{

sp->setPosition(b->GetPosition().x*32,b->GetPosition().y*32,);

sp->setRotation(-CC_RADIANS_TO_DEGREES(b->GetAngle()));

}

}

}


------------------------------------------------------------------------------------------------------------

在新版Cocos3.x中,将物理世界封装到了Scene中,可以通过Cocos进行统一的管理

猜你在找的Cocos2d-x相关文章