2009-10-21 2 views
3

공 모양이 다른 모양을 칠 ​​때 "보잉"사운드를 재생하려고합니다. 어떤 작품. 하지만 조금은 잘 작동합니다 ....Chipmunk Physics 엔진을 사용하여 영구적 인 충돌을 감지하는 방법

볼이 닿거나 롤이 시작될 때 접촉하는 부분과 영구적 인 충돌이 일어나 "보잉"소리가 끊임없이 터집니다.

두 가지가 영구적으로 충돌하는 경우 chipmunk 설명서에서 아무 것도 찾을 수 없습니다. 그래서 저는 어떻게 든 현재 충돌에 대한 마지막 충돌을 비교하는 일종의 타이머를 가지고 스스로 어떻게 생각해야하는지 생각하고 있습니다. 하지만 그건 나에게 해커처럼 들린다.

이 문제를 해결 한 사람이 있습니까? 어떻게 그걸 해결 했니?

+0

코코아 너트가 아니지만 이것을 알아 내기 위해 충격의 속도를 조사해서는 안됩니까? – Will

+0

나는 그것에 대해 생각했지만 chipmunk에서 모양의 속도에 액세스 할 수없는 것 같습니다. 그러나 C, Objective C 및 Cocoa를 처음 접했을 때 나는 잘못하고 있기 때문에 99 %의 기회가있었습니다. – gargantuan

답변

2

접촉이 끊어 때 당신의 "보잉"사운드를 재생 할 수 없습니다? 다람쥐에 콜백이 있습니다. typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, struct cpSpace *space, void *data)

그런 식으로 튀는 때마다 보잉을 얻지 만 방금 굴러 갈 때는 보잉을 얻지 못합니다. 물론, 모양에서 벗어날 때도 얻을 수 있지만, 모양에 따라 기능이 될 수 있습니다.

+1

진입로에서 튀어 오르는 것과 반대로 진입로에서 구르다가 튀어 오르면 튀어 나올 때 소리가 나지 않으면 소리가 나지 않아야합니다. 두 경우 모두 충돌이 분리 된 후이므로 도메인이 바운스되고 결코 굴러 가지 않거나 슬라이드되지 않는 한 on-separate는 좋은 일이라고 생각하지 않습니다. –

1

도형에는 다람쥐 속의 속도가 없습니다. 그들이 붙어있는 시체가 가지고 있습니다. "myShape.body-> v"와 같이 속도에 액세스 할 수 있습니다. 속도가 특정 임계 값을 초과하는지 확인할 수 있어야 '충격'이 언제 발생하는지 알 수 있습니다. 회전 속도를 확인하여 볼이 회전하는지 확인할 수도 있습니다.

2

내가 말하려고 해요 어떤 좋은 방법이라고 생각하지 않지만, 나는 그것이 문제 해결 확신 : 각 개체에 대한

  1. 두 개의 상태 변수를 유지 : (1) 마지막 객체 충돌, (2) 마지막 충돌 시간

  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; 
+0

사실, 당신의 제안은 ID를 재사용 할 수 없다는 경고가 없다는 것을 제외하고는 꽤 좋은 습관이라고 생각합니다. "마지막으로 만든 물건"을 치고 나서 폭발하고, 다른 물건을 때리면 그것을 깨닫지 못하기 때문에 상상해보십시오. 동일한 "최고 ID"가 할당되었습니다. –

관련 문제