Cocos2d-x 封装物理引擎PhysicsBody异常解决方案

使用Cocos封装物理引擎,PhysicsBody会乱飞乱跳、抖动,如下图:下面两种方式都能有效的解决这个问题。

方法一: 关闭物理自动同步(auto step),在update中同步。

自动同步(delta time同步):



不自动同步(固定值同步):


1. 设置物理世界的自动同步为否;

auto scene = Scene::createWithPhysics();
	auto world = scene->getPhysicsWorld();
	world->setGravity(Vec2(0, -50));
	world->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
	world->setAutoStep(false);//物理世界自动同步关掉
   
    auto layer = HelloWorld::create();
	layer->world = world;//将此场景的PhysicsWorld赋值给自定义变量
   
    scene->addChild(layer);

2. 启用update,在update中同步物理世界;

void HelloWorld::update(float dt)
{
	world->step(0.05f);//step()不要传入dt(delta time), 传入固定值,PhysicsBody才会稳定
}


方法二:启用fixed step system

cocos2d-x-3.11将Chipmunk升级为v7.0.1,下面是3.11新增的函数, 只需要调用这个函数就能解决物理异常:
PhysicsWorld::setFixedUpdateRate(int );
当传入参数为0时表示关闭fixed step system,默认值为零(即默认关闭fixed step system)
其含义是每秒钟物理世界更新多少次,一般传入30-50左右足矣,数值越大物理模拟越精确,每秒更新次数过多性能也会下降。Unity物理相关的FixedUpdate()函数默认是0.02秒执行一次,也就相当于每秒50帧。

启用Fixed Step System:
Scene* HelloWorld::createScene()
{
    auto scene = Scene::createWithPhysics();
	auto pWorld = scene->getPhysicsWorld();
	pWorld->setGravity(Vec2(0, -98));
	pWorld->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
	//启用Fixed Step System
	pWorld->setFixedUpdateRate(30);

    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值