如何创建一个会在屏幕上弹跳的身体 [A ball Body],无论它在 cocos2d-box2d 中击中什么,都不会失去或获得速度?
问问题
136 次
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 回答