0

如何创建一个会在屏幕上弹跳的身体 [A ball Body],无论它在 cocos2d-box2d 中击中什么,都不会失去或获得速度?

4

2 回答 2

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());
   }
}

如何设置联系监听器见那里

于 2013-01-26T19:09:07.940 回答
0

周期性地将物体的速度乘以标量t/v.length,其中 t 是目标速度。

另一个答案可能比您需要的要复杂一些。

于 2013-01-27T17:52:32.833 回答