永远移动球

时间:2013-01-26 17:59:17

标签: iphone cocos2d-iphone box2d game-physics

如何在cocos2d-box2d中创建一个将在屏幕上反弹,不会丢失或获得速度的身体[A Ball Body]?

2 个答案:

答案 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是目标速度。

另一个答案可能比你需要的要复杂得多。