2009-05-23 5 views
3

이 문제에 대한 여러분의 제안을 부탁드립니다 ...게임은 프레임 속도에만 의존해야합니까?

간단하게하기 위해 x 축만 살펴 보겠습니다.

이미지 개체가 위치 10에 있으며 그 너비 또한 10 단위로, 초당 100 단위로 이동하며 각 프레임마다 프레임이 낮아서 80 단위를 이동해야합니다. (120)

다음 업데이트 내가 필요 점을 고려 위치 (170)에 개체를 이동합니다 첫 번째 업데이트를 호출 한 후

은 그 위치는 지금 90이고 위치에 같은 크기의 또 다른 목적이있다 충돌 탐지를 구현하고 업데이트 전후에 충돌을 계산하면 아무 것도 작동하지 않습니다.

이제 간단한 질문이옵니다.

이 경우 어떻게해야합니까?

는 같은 마십시오 :이 솔루션을 좋아하지 않아

Position start = destinationPos - currentPos; 
for (int i; i < start; i++) 
    if (IsColliding(movingObj.Position + i, staticObj)) 
     //do the colliding stuff here 

은,이 사건에 대한 괜찮을 수 있지만, 당신이 X, Y, Z와 움직이는 물체의 많은 경우?

다른 솔루션도 좋을지 모르겠지만 확실한 지 모르겠지만 다른 스레드가 루프에서이 계산을 모두 수행해야합니다.

이 스레드는 무한 루프와 같을 것입니다. 그리고 반복 할 때마다 나는 매우 작을 것이라고 생각하는 elapsedTime을 계산할 것입니다. 그리고 충돌을 계속 이동하고 계산 스레드를 유지하고 렌더링 스레드를 훨씬 느리게 처리 할 것입니다. 객체의 현재 상태를 가져 와서 렌더링합니다.

너희들은 어떻게 생각하니?

답변

7

다행스럽게도 우리는 수학적 골격을 어느 정도 해결할 수있는 문제입니다. 설명하는 문제는 동적 인 충돌 감지로 해결됩니다. 이는 두 개체가 프레임간에 충돌했는지 확인하는 데 사용되며 특정 종류의 충돌에 대해서는 때까지 충돌이 발생했을 때 정확하게 알 수 있습니다. 세계의 상태.

당신이 충돌 deteciton 알고리즘을 직접 구현에 관심이없는 경우, 이미 이런 종류의 수행하는 라이브러리 사용으로 보일 것이다

주제에 관한 많은 좋은 책 중 하나는 Real Time Collision Detection입니다.

4

Mike Daniels가 이에 대해 언급했으나 대답은 '아니오'입니다. 개체를 불연속적인 "버스트 (burst)"로 취급하지 않으려 고합니다. 1d에서 예를 들어 봅시다 : 자동차가 x = 0에서 시작하여 앞으로 2 단위/초^2 가속합니다. 각 프레임에서 속도와 위치를 다시 계산하지 않을 것입니다.대신에 여러분은 간단한 계산법을 사용합니다 : 속도는 가속도의 적분이며, 위치는 가속도의 적분입니다. 따라서 v = 2*t 및 p = t^2. 그러면 초기 조건 이후 경과 한 시간을 토대로 t를 대체 할 수 있습니다.

이제 100 단위에 -3 단위/초^2로 가속되는 두 번째 개체가 있다고 가정합니다. 그 속도는 -3*t이고 위치는 100 - (3/2)*t^2입니다. 두 위치가 서로 같을 때를 해결하면 t = 40 일 때 충돌하는 것을 볼 수 있습니다.

방정식을 사용하면 사물이 프레임간에 충돌하는지 확인할 수 있습니다. 이 작업을 수행 할 수있는 여러 프레임 워크가 있지만 작동 원리를 이해하는 것이 중요합니다.

3

이것은 일종의 부수적 인 문제이지만, 게임의 프레임 속도에서 로직 업데이트 속도를 분리하고 물리 및 로직을위한 고정 된 시간 단계를 갖는 것이 가치있는 일임을 잘 알게 될 것입니다. 그것은 많은 물리학과 충돌 재료를 훨씬 더 단순하게 만들고, 프레임 속도가 떨어지면 폭발을 막습니다.

Glenn Fiedler's site에는 이러한 방식으로 작동하는 게임 루프의 예가 있습니다. 개인적으로, 나는 항상 선택의 여지가 고정 속도 업데이 트와 함께 갈거야. 그것은 단지 많은 것들, 특히 물리학을 단순화합니다.

+0

그건 논리적 인 것 같아요. 내 걱정거리는 업데이트/게임 논리 스크립트를 통해 부분적으로 실행되는 것이 무엇이든 '그리기'또는 '렌더링'되거나 비정상적인 방식으로 나타나는 것을 유발한다는 것입니다. 벽이나 부분을 지나는 총알은 아직 지워지지 않았거나 그런 식으로. 자바 스크립트가 주로 비동기식이기 때문에 주로 자바 스크립트에 중점을 둡니다. 다른 언어보다 더 위험하다고 생각하게합니다. – semicolon

관련 문제