2011-03-29 2 views
3

누군가가 box2d 내 시간 단계를 수정하는 데 도움이되는지 궁금합니다. 더 나은 시간 단계를 구현하여 방금 Bounce Z Ballz이라는 게임을 개선하려고 시도 중입니다. 현재는 가변 시간 단계가 내장되어 있습니다. 몇 가지 유용한 정보를 읽었지만 실제로는 Cocos2d/box2d 템플릿에 내장 된 것과 비슷한 것을 뭔가 넣으려는 내 머리를 이해할 수 없습니다. Glenn Fiedler's 솔루션입니다.어떻게하면 box2d에서 더 나은 시간 단계 (고정 또는 반 고정)를 구현할 수 있습니까?

TL; DR 구현하기 위해

감사합니다,

스티브

답변

8

(좀 더 일관성있는 뭔가 가변 시간 단계에서 내장에서 내적인 Cocos2D/Box2D의 게임 시간 간격을 변경하려면) 이 경우, 물리 엔진이 여전히 적절하게 수행하면서 수행 할 수있는 최대 시간 간격을 알아야합니다. 논쟁의 여지없이 0.03 초라고 가정 해 봅시다.

기본적으로 업데이트 과정에서 델타 시간을 단계 시간으로 전달하는 대신 해당 최대 크기의 세그먼트로 나누기를 원할 것입니다. 따라서 현재 루프 사이클의 델타 시간이 0.08 초인 경우 0.03 초, 0.03 초, 0.02 초의 시간 간격으로 업데이트 루프를 3 번 ​​실행해야합니다. 물리학 시스템은 여전히 ​​0.08 초 정도 진행되었지만 제대로 수행하려면 충분히 작은 단계로 수행해야합니다.

Update:(float)deltaTime 
{ 
    float maximumStep = 0.03; 
    float progress = 0.0; 
    while (progress < deltaTime) 
    { 
     float step = min((deltaTime-progress), maxStep); 
     **PHYSICS STEP(step)** 
     progress += step; 
    } 
} 
+0

감사합니다. Jordaan. 이것은 지금까지 들었던 가장 쉬운 설명입니다. 그래서 내 init 메소드를 호출 할 때 : [self schedule: @selector(tick:)] 추가 매개 변수를 포함해야합니까? 또한이 구현으로 서로 다른 FPS (즉, iPhone 3G 및 iPhone 4)로 표시 될 수있는 여러 기기에서 일관된 (거의 동일하지는 않더라도) 시뮬레이션을 만들 수 있습니까? – SteveWight

+0

예. 모든 단계는 최대 단계 값을 얼마나 잘 선택했는지에 달려 있습니다. 주변을 실험하고 box2d의 설명서에서 값을 제안하는지 확인하십시오. 그러나 값을 너무 낮게 설정하면 물리 시스템이 더 자주 작동해야하므로 전반적인 성능이 저하 될 수 있습니다. –

+0

좋아요. 나는이 솔루션을 구현했고 모든 것이 더 일관성있게 실행되고있는 것 같다. 좀 더 테스트해야 겠지만 요르단에게 다시 한번 감사 드려요.이게 내가 찾고 있던 것입니다. – SteveWight