Как я могу обнаружить постоянное столкновение с движком Бурундука Физики

StackOverflow https://stackoverflow.com/questions/1603319

Вопрос

Я пытаюсь сыграть в "боинг" звук, когда форма шара поражает любую другую форму. Который работает. Но работает слишком хорошо ....

Когда шар останавливается или начинает катиться, он находится в постоянном столкновении с тем, к чему прикасается, поэтому " боинг " звук горит постоянно.

Я не могу найти ничего в документации бурундука, чтобы сказать мне, когда две вещи постоянно сталкиваются. Так что я думаю, что мне придется как-то самому разобраться, возможно, с каким-то таймером, который сравнивает последнее столкновение с текущим. Но это звучит неприлично для меня.

Кто-нибудь занимался этой проблемой? Как ты это решил?

Это было полезно?

Решение

Не могли бы вы просто поиграть в "боинг"? звук, когда контакт сломан? Для бурундука существует обратный вызов, typedef void (* cpCollisionSeparateFunc) (cpArbiter * arb, struct cpSpace * space, void * data)

Таким образом, вы получаете боинг всякий раз, когда он подпрыгивает, но не когда он просто катится. Конечно, вы также получите один, когда он скатится с вашей фигуры, но это может быть особенность, в зависимости от того, как вы на это смотрите.

Другие советы

Я не думаю, что то, что я собираюсь сказать, является хорошей практикой, но я уверен, что это решит вашу проблему:

<Ол>
  • Для каждого объекта сохраните две переменные состояния: (1) последний объект столкнулся с, (2) время последнего столкновения.

  • При столкновении воспроизводить звук можно только в том случае, если столкнувшийся объект отличается (и шар) ИЛИ определенное «время дельты» прошло с момента последнего столкновения. Затем запишите последние статистические данные о столкновениях.

  • Это довольно просто и очень эффективно.

    // In your ball interface
    id lastCollisionObject;
    double lastCollisionTime;
    
    
    // When a collision occurs...
    double now = GetTime();
    id other = GetCollisionObject();
    if ((now - lastCollisionTime) > 0.3 || other != lastCollisionObject) {
        PlaySound(kBoingSound);
    }
    lastCollisionObject = other;
    lastCollisionTime = now;
    

    Фигуры не имеют скорости в бурундуке. Тела, к которым они прикреплены, имеют это. Вы можете получить доступ к скорости следующим образом: "myShape.body- > v". Я согласен, что вы просто должны быть в состоянии проверить, превышает ли скорость определенный порог, чтобы знать, когда происходит «удар». Вы также можете проверить скорость вращения, чтобы увидеть, катится ли шар.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top