2016-12-14 6 views
1

나는이 gameloop 구현에 대해 의심을 가지고gameloop 및 deltatime 보간 C++

#include <chrono> 
#include <iostream> 

using namespace std::chrono_literals; 

// we use a fixed timestep of 1/(60 fps) = 16 milliseconds 
constexpr std::chrono::nanoseconds timestep(16ms); 

struct game_state { 
    // this contains the state of your game, such as positions and velocities 
}; 

bool handle_events() { 
    // poll for events 

    return false; // true if the user wants to quit the game 
} 

void update(game_state *) { 
    // update game logic here 
    std::cout << "Update\n"; 
} 

void render(game_state const &) { 
    // render stuff here 
    //std::cout << "Render\n"; 
} 

game_state interpolate(game_state const & current, game_state const & previous, float alpha) { 
    game_state interpolated_state; 

    // interpolate between previous and current by alpha here 

    return interpolated_state; 
} 

int main() { 
    using clock = std::chrono::high_resolution_clock; 

    std::chrono::nanoseconds lag(0ns); 
    auto time_start = clock::now(); 
    bool quit_game = false; 

    game_state current_state; 
    game_state previous_state; 

    while(!quit_game) { 
    auto delta_time = clock::now() - time_start; 
    time_start = clock::now(); 
    lag += std::chrono::duration_cast<std::chrono::nanoseconds>(delta_time); 

    quit_game = handle_events(); 

    // update game logic as lag permits 
    while(lag >= timestep) { 
     lag -= timestep; 

     previous_state = current_state; 
     update(&current_state); // update at a fixed rate each time 
    } 

    // calculate how close or far we are from the next timestep 
    auto alpha = (float) lag.count()/timestep.count(); 
    auto interpolated_state = interpolate(current_state, previous_state, alpha); 

    render(interpolated_state); 
    } 
} 

나는 매끄러운 "세계 객체"운동을 만들기 위해 deltaTime 보간, 을 구현하는 방법을 알아야합니다. 이것은 deltaTime과 보간법을 사용하는 "advance"의 좋은 구현입니까? 아니면 다른가?

예 : 예를 들어

obj* myObj = new myObj(); 

float movement = 2.0f; 
myObj->position.x += (movement*deltaTime)*interpolation; 

내가 보간 deltatime의 사용에 대한 몇 가지 도움이 필요합니다.

감사합니다!

답변

1

보간은 일종의 예측 함수 (스프라이트가 미래의 시간에있을 것임)에서 항상 사용됩니다. 보간 변수를 사용하는 방법에 대한 질문에 대답하려면 델타를 인수로 사용하고 다른 하나는 보간 시간을 사용하는 두 가지 업데이트 함수가 필요합니다. 기능에 관한 아래의 예를 참조하십시오 (당신이 사용하는 언어를 코딩에 따라 구현) :

void update_funcA(int delta) 
{ 
    sprite.x += (objectSpeedperSecond * delta); 
} 

void predict_funcB(int interpolation) 
{ 
    sprite.x += (objectSpeedperSecond * interpolation); 
} 

을 두 기능이 같은 일이 그렇게에 인수로 전달 델타와 보간 값을 두 번 호출 하나를 가지고 할 위에 당신이 볼 수 있듯이 각각의 호출은하지만 어떤 시나리오에서는 두 가지 기능이 더 좋을 것입니다. 중력을 다룰 때 - 물리학 게임 일 수도 있습니다. 이해해야 할 것은 보간 값은 항상 의도 한 루프 시간의 일부이므로 프레임 속도에 관계없이 원활한 이동을 보장하기 위해 해당 분수를 이동하기 위해 스프라이트가 필요할 것입니다.