Domanda

Sto provando a suonare un " boing " suono quando un colpo a forma di palla ha qualsiasi altro tipo di forma. Che funziona Ma funziona un po 'troppo bene ....

Quando la palla si ferma, o inizia a rotolare, è in collisione permanente con qualunque cosa tocchi, quindi il "boing" il suono si accende costantemente.

Non riesco a trovare nulla nella documentazione di Chipmunk per dirmi quando due cose si scontrano permanentemente. Quindi sto pensando che dovrò in qualche modo capirlo da solo, probabilmente con una sorta di timer che confronta l'ultima collisione con quella attuale. Ma questo mi sembra confuso.

Qualcuno ha affrontato questo problema? Come l'hai risolto?

È stato utile?

Soluzione

Non potresti semplicemente suonare il tuo " boing " suono quando il contatto è ROTTO? C'è un callback per quello in chipmunk, typedef void (* cpCollisionSeparateFunc) (cpArbiter * arb, struct cpSpace * space, void * data)

In questo modo ottieni boing ogni volta che rimbalza, ma non quando sta solo rotolando. "Naturalmente, ne otterrai anche uno quando rotolerà dalla tua forma, ma questa potrebbe essere una caratteristica a seconda di come la vedi.

Altri suggerimenti

Non penso che ciò che sto per dire sia una buona pratica, ma sono sicuro che risolverà il tuo problema:

  1. Per ogni oggetto, mantenere due variabili di stato: (1) L'ultimo oggetto si è scontrato, (2) L'ultimo tempo di collisione.

  2. In caso di collisione, riproduci un suono solo se l'oggetto scontrato è diverso (e una palla) O un certo "tempo delta". è trascorso dall'ultima collisione. Quindi registra le ultime statistiche sulle collisioni.

Questo è piuttosto semplice e molto 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;

Le forme non hanno velocità in chipmunk. I corpi a cui sono attaccati per averlo. Puoi accedere alla velocità in questo modo: " myShape.body- > v " ;. Sono d'accordo che dovresti solo essere in grado di verificare se la velocità supera una determinata soglia per sapere quando si verifica un 'impatto'. Puoi anche controllare la velocità di rotazione per vedere se la palla sta rotolando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top