Question

J'essaie de jouer un " boing " le son quand une forme de balle frappe est un autre type de forme. Qui fonctionne Mais fonctionne un peu trop bien ....

Lorsque la balle s’immobilise ou commence à rouler, c’est dans une collision permanente avec tout ce qui la touche, donc le "boing" le son déclenche en permanence.

Je ne trouve rien dans la documentation du tamia pour me dire quand deux objets entrent en collision en permanence. Je pense donc que je devrai trouver une solution moi-même, probablement avec une sorte de minuterie qui compare la dernière collision à la collision actuelle. Mais cela me semble hacky.

Quelqu'un at-il abordé ce problème? Comment l'avez-vous résolu?

Était-ce utile?

La solution

Ne pouvez-vous pas simplement jouer votre "boing"? son lorsque le contact est cassé? Il existe un rappel pour cela dans chipmunk, typedef void (* cpCollisionSeparateFunc) (cpArbiter * arb, struct cpSpace * espace, void * data)

De cette façon, vous obtenez des boings chaque fois que cela rebondit, mais pas quand cela ne fait que rouler. "Bien sûr, vous en aurez également un quand il se détachera de votre forme, mais cela pourrait être une caractéristique en fonction de la façon dont vous le regardez.

Autres conseils

Je ne pense pas que ce que je vais dire est une bonne pratique, mais je suis sûr que cela résoudra votre problème:

  1. Pour chaque objet, conservez deux variables d'état: (1) le dernier objet entré en collision, (2) la dernière heure de collision.

  2. Lors d’une collision, ne jouez un son que si l’objet heurté est différent (et une balle) OU un certain "temps delta" s'est écoulé depuis la dernière collision. Enregistrez ensuite les statistiques de la dernière collision.

C’est assez simple et très efficace:

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

Les formes n'ont pas de vélocité dans le tamia. Les corps auxquels ils sont attachés pour l'avoir. Vous pouvez accéder à vélocité comme ceci: "myShape.body- > v". Je conviens que vous devriez simplement pouvoir vérifier si la vitesse dépasse un certain seuil pour savoir quand un "impact" se produit. Vous pouvez également vérifier la vitesse de rotation pour voir si la balle roule.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top