如何在cocos2d-box2d中创建一个将在屏幕上反弹,不会丢失或获得速度的身体[A Ball Body]?
答案 0 :(得分:1)
将夹具的恢复原状设置为1,并将摩擦力设置为0。
Box2D手册说:
恢复用于使物体反弹。恢复值通常设置在0和1之间。考虑在桌子上放一个球。 < ...>值为1表示球的速度将被精确反映。这被称为完全弹性碰撞。
摩擦值为0会导致摩擦
在没有摩擦和完全弹性碰撞的情况下,您的球会在屏幕周围反弹,永远不会在静态环境中失去或获得的速度。如果环境不是静止的,那么与移动物体碰撞将改变球的速度。
要解决这个问题,我建议下一招。设置联系人监听器,并在PostSolve方法中正确测量你的球速:
void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse)
{
if(contact->GetFixtureA()->GetBody() == YOUR_BALL_BODY ||
contact->GetFixtureB()->GetBody() == YOUR_BALL_BODY)
{
float speed = YOUR_BALL_BODY->GetLinearVelocity().Length();
float koef = YOUR_NEEDED_SPEED / speed;
YOUR_BALL_BODY->SetLinearVelocity(koef * YOUR_BALL_BODY->GetLinearVelocity());
}
}
如何设置联系人侦听器,请参阅there。
答案 1 :(得分:0)
定期将身体的速度乘以标量t/v.length
,其中t是目标速度。
另一个答案可能比你需要的要复杂得多。