【发布时间】:2013-01-26 17:59:17
【问题描述】:
如何在 cocos2d-box2d 中创建一个会在屏幕上弹跳的身体 [A ball Body],无论它击中什么,都不会失去或获得速度?
【问题讨论】:
标签: iphone cocos2d-iphone box2d game-physics
如何在 cocos2d-box2d 中创建一个会在屏幕上弹跳的身体 [A ball Body],无论它击中什么,都不会失去或获得速度?
【问题讨论】:
标签: iphone cocos2d-iphone box2d game-physics
将夹具的恢复设置为 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。
【讨论】:
周期性地将物体的速度乘以标量 t/v.length,其中 t 是目标速度。
另一个答案可能比您需要的要复杂一些。
【讨论】: