如果只是对坐标的移动、持续改变位置,我们完全可以通过计划任务或者递归来解决,
如果涉及对物理世界中移动、碰撞等属性较为逼真的模拟,我们需要借助物理引擎的帮助。
世界、刚体、夹具、监听
----------------------------------------------------------------------
设置世界的属性
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进行统一的管理