Chipmunk Physics 엔진과의 영구 충돌을 어떻게 감지 할 수 있습니까?
-
05-07-2019 - |
문제
나는 볼 모양이 다른 종류의 모양 일 때 "보잉"소리를 연주하려고합니다. 작동합니다. 하지만 조금 잘 작동합니다 ....
공이 휴식을 취하거나 굴러 가기 시작하면 만지는 모든 것과 영구적으로 충돌하여 "보잉"소리가 끊임없이 불을 피 웁니다.
Chipmunk 문서에서 두 가지가 영구적으로 충돌하는시기를 알려주는 것을 찾을 수 없습니다. 그래서 나는 현재 충돌과의 마지막 충돌을 비교하는 일종의 타이머로 어떻게 든 스스로 알아 내야 할 것이라고 생각합니다. 그러나 그것은 나에게 해킹된다.
이 문제를 해결 한 사람이 있습니까? 어떻게 해결 했습니까?
해결책
접촉이 깨질 때 "보잉"소리를 재생할 수 없습니까? Chipmunk에는 콜백이 있습니다. typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, struct cpSpace *space, void *data)
그렇게하면 튀어 나올 때마다 보잉을 얻지 만, 그냥 굴릴 때는 아닙니다. '코스, 당신은 또한 당신의 모양에서 롤링 될 때 하나를 얻을 수 있지만, 그것은 당신이 그것을 보는 방법에 따라 특징 일 수 있습니다.
다른 팁
나는 내가 말하려고하는 것이 좋은 관행이라고 생각하지 않지만, 그것이 당신의 문제를 해결할 것이라고 확신합니다.
각 객체에 대해 두 개의 상태 변수를 유지하십시오. (1) 마지막 객체와 충돌 한 (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;
모양은 다람쥐의 속도가 없습니다. 그들이 그것을 가지고있는 시체. "myshape.body-> v"와 같이 속도에 액세스 할 수 있습니다. 나는 당신이 속도가 '충격'이 언제 발생하는지 알기 위해 특정 임계 값을 초과하는지 확인할 수 있어야한다는 데 동의합니다. 또한 회전 속도를 확인하여 공이 굴러 가는지 확인할 수 있습니다.