Pregunta

Estoy tratando de jugar un '' boing '' Suena cuando una forma de bola golpea a cualquier otro tipo de forma. Que funciona Pero funciona demasiado bien ...

Cuando la pelota se detiene o comienza a rodar, está en una colisión permanente con lo que sea que esté tocando, por lo que el "boing" el sonido se dispara constantemente.

No puedo encontrar nada en la documentación de Chipmunk que me diga cuando dos cosas están colisionando permanentemente. Así que estoy pensando que tendré que averiguarlo de alguna manera, probablemente con algún tipo de temporizador que compare la última colisión con la colisión actual. Pero eso me suena raro.

¿Alguien ha abordado este problema? ¿Cómo lo resolviste?

¿Fue útil?

Solución

¿No pudiste simplemente reproducir tu " boing " ¿Sonido cuando el contacto está ROTO? Hay una devolución de llamada para eso en chipmunk, typedef void (* cpCollisionSeparateFunc) (cpArbiter * arb, struct cpSpace * space, void * data)

De esa manera, obtienes boings cada vez que rebota, pero no cuando solo está rodando. Por supuesto, también obtendrás una cuando se desplace de tu forma, pero esa podría ser una característica que dependerá de cómo la mires.

Otros consejos

No creo que lo que voy a decir sea una buena práctica, pero estoy seguro de que resolverá tu problema:

  1. Para cada objeto, mantenga dos variables de estado: (1) El último objeto colisionó con, (2) El último tiempo de colisión.

  2. En caso de colisión, solo reproduce un sonido si el objeto colisionado es diferente (y una bola) O un cierto " tiempo delta " Ha transcurrido desde la última colisión. Luego registre las últimas estadísticas de colisión.

Esto es bastante simple y muy efectivo:

// 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;

Las formas no tienen velocidad en la ardilla listada. Los cuerpos a los que están unidos para tenerlo. Puede acceder a la velocidad de esta forma: " myShape.body- > v " ;. Estoy de acuerdo en que debería poder verificar si la velocidad está por encima de un cierto umbral para saber cuándo ocurre un 'impacto'. También puedes verificar la velocidad de rotación para ver si la bola está rodando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top