Pergunta

Eu estou tentando reproduzir um som "boing" quando um hit forma de bola é qualquer outro tipo de forma. Que funciona. Mas funciona bem demais ....

Quando a bola vem para descansar, ou começa a rolar, é em uma colisão permanente com o que é tocar, de modo a "Boing" fogos de som constantemente.

Eu não consigo encontrar nada na documentação do Chipmunk para me dizer quando duas coisas estão colidindo permanentemente. Então, eu estou pensando que vou ter que de alguma forma descobrir sozinho, provavelmente com algum tipo de temporizador que comparar a última colisão contra a colisão atual. Mas isso soa hacky para mim.

Alguém já abordou esta questão? Como você resolvê-lo?

Foi útil?

Solução

Você não pode apenas jogar o seu som "boing" quando o contato é quebrado? Há um retorno de chamada para que em chipmunk, typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, struct cpSpace *space, void *data)

Assim que você começa boings sempre que ele salta, mas não quando está apenas rolando. 'Claro, você também vai ter um quando se rola fora de sua forma, mas que poderia ser uma característica dependendo de como você olha para ele.

Outras dicas

Eu não acho que o que eu estou prestes a dizer é uma boa prática, mas eu tenho certeza que ele vai resolver o seu problema:

  1. Para cada objeto, mantenha duas variáveis ??de estado:. (1) O último objeto colidiu com, (2) A última vez colisão

  2. Após a colisão, só jogar um som se o objeto colidiram é diferente (e uma bola) ou de um determinado "tempo delta" tem decorrido desde a última colisão. Em seguida, gravar as estatísticas do último colisão.

Isso é muito simples e muito eficaz:

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

Formas não tem velocidade no esquilo. Os corpos estão ligados para tê-lo. Você pode acessar a velocidade como esta: "myShape.body-> v". Concordo que você deve apenas ser capaz de verificar se a velocidade for acima de um determinado limiar de saber quando um 'impacto' ocorre. Você também pode verificar a velocidade de rotação para ver se a bola está rolando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top