2014-10-12 2 views
1

저는 2D 플랫폼을 만드는 SFML을 사용하고 있습니다. 나는 너무 많은 시간대 기사를 읽었지 만 그들은 나를 위해 잘 작동하지 않는다. 나는 2500fps 타임 스텝과 같은 방식으로 구현하고 있는데, 놀랍게도 부드럽다. 내 랩톱에서 300FPS를 얻고있다. (나는 랩으로 체크한다.) 랩탑에서는 부드럽지만 여전히 재생 가능하다. 여기2500 FPS에서 시간대가 고정 되었습니까?

는 코드 조각입니다 :

sf::Clock clock; 
const sf::Time TimePerFrame = sf::seconds(1.f/2500.f); 
sf::Time TimeSinceLastUpdate = sf::Time::Zero; 
sf::Time elapsedTime; 

이 변수이며, 여기에 게임 루프가의 Player.h에서

while(!quit){ 
     elapsedTime = clock.restart(); 
     TimeSinceLastUpdate += elapsedTime; 

     while (TimeSinceLastUpdate > TimePerFrame){ 
      TimeSinceLastUpdate -= TimePerFrame; 
      Player::instance()->handleAll(); 
     } 

     Player::instance()->render(); 
} 

, 내가있어 이동 상수,

const float GRAVITY = 0.35  /2500.0f; // Uses += every frame 
    const float JUMP_SPEED = -400.0f/2500.0f; //SPACE -> movementSpeed.y = JUMP_SPEED; 

    //When character is touching to ground 
    const float LAND_ACCEL = 0.075 /2500.0f; // These are using += 
    const float LAND_DECEL = 1.5 /2500.0f; 
    const float LAND_FRICTION = 0.5 /2500.0f; 
    const float LAND_STARTING_SPEED = 0.075; // This uses =, instead of += 

Player 클래스의 handleAll 함수에는

이 있습니다.
cImage.move(movementSpeed); 
checkCollision(); 

마지막으로 checkCollision 함수는 문자의 마스터 경계 상자가 각면에서 객체의 사각형과 교차하는지 확인하고 속도 x 또는 y를 0으로 설정 한 다음 문자 위치를 가장자리로 설정하여 겹침을 수정합니다. * 2500.0f/60.0f 모든 상수, 그것은 같은 느끼지 않는다처럼 간단하게 할 수 없어,

//Collision 
if(masterBB().intersects(objectsIntersecting[i]->GetAABB())){ 
    //HORIZONTAL 
    if(leftBB().intersects(objectsIntersecting[i]->GetAABB())){ 
     if(movementSpeed.x < 0) 
      movementSpeed.x = 0; 
     cImage.setPosition(objectsIntersecting[i]->GetAABB().left + objectsIntersecting[i]->GetAABB().width + leftBB().width , cImage.getPosition().y); 
    } 
    else if(rightBB().intersects(objectsIntersecting[i]->GetAABB())){ 
     if(movementSpeed.x > 0) 
      movementSpeed.x = 0; 
     cImage.setPosition(objectsIntersecting[i]->GetAABB().left - rightBB().width , cImage.getPosition().y); 
    } 

    //VERTICAL 
    if(movementSpeed.y < 0 && topBB().intersects(objectsIntersecting[i]->GetAABB())){ 
     movementSpeed.y = 0; 
     cImage.setPosition(cImage.getPosition().x , objectsIntersecting[i]->GetAABB().top + objectsIntersecting[i]->GetAABB().height + masterBB().height/2); 
    } 

    if(movementSpeed.y > 0 && bottomBB().intersects(objectsIntersecting[i]->GetAABB())){ 
     movementSpeed.y = 0; 
     cImage.setPosition(cImage.getPosition().x , objectsIntersecting[i]->GetAABB().top - masterBB().height/2); 
     //and some state updates 
    } 
} 

내가 좋아하는 만 시간을 60 FPS 타임 스텝을 사용하려고하지만, 모든 속도의 변수가 너무 느려집니다. 가까이있는 상수를 얻으면 "괜찮습니다"라고 느껴지지만 충돌이 일어날 때마다 캐릭터의 위치가 항상 설정되고 모든 프레임 I에 고속 상수가 적용되어 대상에 큰 무릎이 생겨지도에서 벗어납니다. 나는 일반적으로, 나는 시간 단계 코드

cImage.move(movementSpeed*TimePerFrame.asSeconds()); 

사용했다하지만 당신이 본대로, 난 그냥 모든 일정에 /2500.0f 넣어 내가 사용하지 않는 책을 추가 할 필요가 ...

를 추측 그것.

프레임 당 1/2500 초입니까? 그렇지 않다면, 어떻게 이것들을 모두 1/60.0f로 바꿀 수 있습니까?

+1

시뮬레이션을 애니메이션보다 빠른 속도로 실행 시키거나 움직이기 전에 충돌을 확인할 수 있으므로이를 기반으로 동작을 조정하고 조정할 수 있습니다. 예 : 이동하기 전에 충돌에 대한 새 경계 상자를 확인하고 충돌이 발생한 지점과 시간을 정확히 파악한 다음이를 기반으로 새 경로를 계산하십시오 – bames53

+0

2500 FPS ?! 너 진심이야? – Exceptyon

답변

2

잘못하고 있습니다.

모니터의 재생 빈도는 60Hz (= 60FPS) 일 가능성이 높으므로 2500FPS에서 이미지를 렌더링하려고하면 리소스가 낭비됩니다. 2500 FPS를 선택하는 유일한 이유는 운동이 동일하게 작동하지 않는다는 것입니다. 운동 코드에 문제가있을 수 있다고 생각 해본 적이 없습니까?

고정 된 타임 스텝 (famous article)을 구현하면 원하는 속도로 물리를 실행할 수 있습니다 (2500 "FPS"는 여전히 미친 짓이므로하지 마십시오). 렌더링 속도. 따라서 다양한 FPS를 얻더라도 물리에 영향을 미치지 않습니다.

+0

60fps로 설정하고 사용자가 144hz 모니터를 사용하면 어떻게됩니까? 그는 너무 고르지 않을 것입니다. – user3858240

+0

모든 게임과 같은 옵션 추가 ... – Lukas

관련 문제