2012-06-17 9 views
5

현재 Android 용 게임을 개발 중이며 내가 갖고있는 문제에 대한 전문 지식을 알려드립니다.Android 게임 개발 : 충돌 감지 실패

배경 :

  1. 내 게임 필요한 속도를 계산을 수행하기 전에 델타 시간 값을 고려 프레임 레이트 독립된 움직임을 통합한다.

  2. 게임은 전통적인 2D 플랫폼입니다.

시트 문제점 :

여기 (간체) 내 문제입니다. 내 캐릭터가 플랫폼 상단에 사각형으로 서있는 것처럼 보자 ("중력"은 characterVelocityDown의 일정한 하향 속도 임).

I는 다음과 같이 (아래 Y 축 점 가정) 충돌 검출 정의한

:

가 은 characterFootY가 내 사각형 캐릭터 염기의 Y 좌표이다 감안 platformSurfaceY 상부 Y이다

을 내 플랫폼의 -coordinate 및 platformBaseY가 낮은 내 플랫폼의 y 좌표입니다 :

if (characterFootY + characterVelocityDown > platformSurfaceY && characterFootY + characterDy < platformBaseY) { 

        //Collision Is True 
        characterFootY = platformSurfaceY; 
        characterVelocityDown = 0; 

       } else{ 
        characterVelocityDown = deltaTime * 6; 

이 방식은 페이지를 작동 게임이 규칙적인 속도로 작동 할 때 오류가 있습니다. 게임이 감속하는 경우에는, (이전 프레임과 현재 프레임 사이에 경과 된 시간)를 deltaTime이 커지고, characterFootY + characterVelocityDown은 떨어진다 충돌 검출 및 특성을 정의하는 경계를 초과 똑바로 (마치 텔레포트처럼).

이 문제를 방지하려면 어떻게해야합니까?

사전에 도움을 주셔서 감사 드리며 앞으로도 학습을 기다리고 있습니다!

+0

다른 사람이이 문제를 겪고있는 경우이 문제를 해결하려면 deltaTime 값을 제한하여 특정 값 이상인 경우 cap으로 설정하면됩니다. 이렇게하면 게임 속도가 일치하지 않지만 대부분의 경우 괜찮습니다. – SeveN

+0

비교가 수행 될 수 있기 때문에 이전 및 이후 델타 값을 모두 갖고 있습니까? – cjk

답변

1

당신이해야 할 일은 일정 델타 시간으로 물리 루프를 실행하고 현재 틱으로 필요한만큼 반복합니다.

const float PHYSICS_TICK = 1/60.f; // 60 FPS 
void Update(float dt) 
{ 
    m_dt += dt; 
    while(m_dt > PHYSICS_TICK) 
    { 
     UpdatePhysics(PHYSICS_TICK); 
     m_dt -= PHYSICS_TICK; 
    } 
} 

가 왼쪽 틱 (m_dt) miniumum 눈금 및 최대 눈금에 대한
캡을 처리하기 위해 사용되는 다양한 공예있다는 필수입니다.

+0

그리고 대부분의 게임에서 게임 논리 (물리뿐만 아니라) 전체에 대한 시간 단계를 수정하는 것이 가장 쉽고/쉽습니다. –

1

여기서 문제는 속도 저하가 불가피하다는 것입니다. 코드를 시도하고 최적화 할 수는 있지만 항상 느린 기기 또는 게임의 바쁜 부분이있는 사용자가있어 평소보다 처리 시간이 오래 걸릴 수 있습니다. 일정한 델타를 가정하는 대신에 그 반대를 가정하십시오. 누군가가 주판에 그것을 설치하려고 시도 할 수 있다는 것을 깨닫고 코드를 작성하십시오.

기본적으로 SeveN이 말한 것처럼 게임 루프를 느려지 게 만듭니다. 이 작업을 수행하는 유일한 방법은 델타가 얼마나 큰지에 대한 제한을 두는 것입니다. 이렇게하면 시계가 정시에 제대로 작동하지 않게되지만, 생각할 때 대부분의 게임이 느리게 진행되는 방식입니다. Pentium 66에서 StarCraft를 실행하지 않고 5FPS이지만 최대 속도로 작동 시키면 슬라이드 쇼가 아닌 일반적인 속도로 느려지고 처리됩니다.

게임에서 느려지는 동안 이런 일을했다면 눈에 띄게 속도가 느려지 겠지만 계산은 여전히 ​​자리에 있어야합니다.

편집 : 당신이 SeveN임을 깨달았습니다. 잘 했어.

+0

[신성 모독을 환영하지 않습니다] (http://meta.stackexchange.com/a/22233/142838). – meagar