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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 25 октября 2009

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

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

  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;
2 голосов
/ 05 января 2010

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

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

1 голос
/ 25 октября 2009

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

...