我正在使用 win32 api 用 C++ 制作一款类似《太空入侵者》的游戏。我是初学者。
当我提高游戏 FPS 时,游戏对象在屏幕上移动得更快。我希望物体在屏幕上移动的速度相同,无论 FPS 是多少。
我使用
std::this_thread::sleep_for(std::chrono::milliseconds(targetFrameTime - elapsedTime));
我在主循环中移动对象,如下所示:
if (userInput.get_right_key_down()) {
rect_x = rect_x + 5;
}
如果可能的话,我宁愿不使用线程。我不太明白,也不知道我是否需要它。
我认为最好的办法是固定开始时间,执行sleep_for一段时间,然后使用速度因子进行移动。
const auto start = std::chrono::high_resolution_clock::now();
...
std::this_thread::sleep_for(std::chrono::seconds(1));
像这样在主循环中移动对象:
const auto end = std::chrono::high_resolution_clock::now();
const std::chrono::duration<double> elapsed = end - start;
double dt = elapsed.count();
...
if (userInput.get_right_key_down()) {
rect_x = (int) ((double) rect_x + 5.0 * dt); // 5.0 - is the speed factor px/sec
// but the best way is to use rect_x as a field with type of double.
// and convert (trunc) it to the integer only on the render step
// rect_x = rect_x + 5.0 * dt;
}