【问题标题】:Forever moving ball [closed]永远移动的球[关闭]
【发布时间】:2013-01-26 17:59:17
【问题描述】:

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

【问题讨论】:

    标签: iphone cocos2d-iphone box2d game-physics


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-17
        相关资源
        最近更新 更多