如何实现线程为我的游戏添加计时器?

时间:2016-12-02 17:30:51

标签: c++ multithreading

我为游戏编写了MVP。但是现在我想添加一个秒表,以便玩家可以在游戏的左下角或右下角看到倒计时。这不是关于如何创建这样的秒表的问题,而是关于如何将其包含在我的游戏中。

我已经想出如何将时钟数字渲染到屏幕上,但问题是当我使用任何输入触发时钟时游戏仍然停留在时钟循环中。这里有一些代码可以解释:

// when the player makes her first input the clock is triggered

if (!CLOCK)
    this->clockStatus(ON);


// within the clockStatus function
void Game::clockStatus(TimerState Status)
{
    do {                             /* Infinite Loop */
        t2->getTimefromSeconds(getCurrentSysTime());
        break;
    } while (1);
    while (1) {                        /* Another infinite loop */
        t_inter->getTimefromSeconds(getCurrentSysTime());
        t1 = (Timer*)(t_inter - t2);
    }
}

t1的输出通过以下方式显示:

t1.display();

为清楚起见,TimeState是一个管理秒表状态的枚举。(ON / OFF)计时器是实际的秒表类。

经过研究我得出的结论是,当玩家第一次进入游戏时,会触发秒表,我应该为此创建一个新线程。这样主要功能可以正常运行,辅助线程可以计算游戏时间。有没有关于如何实现这个的教程或pdf或练习?此外,欢迎所有有用的建议。

1 个答案:

答案 0 :(得分:1)

根据我的理解,您希望能够启动秒表,然后显示自启动以来经过的时间。最简单的方法是存储开始时间,然后(在正常的渲染循环中)找到与当前时间的差异。你可以使用这个助手类:

#include <chrono>

inline auto currentTime() {
    return std::chrono::high_resolution_clock::now();
}

struct Timer {
    Timer() { reset(); }
    void reset() { // reset the stopwatch to 0
        startTime = currentTime();
    }
    double getElapsed() { // get the elapsed time (in seconds)
        return std::chrono::duration_cast<std::chrono::nanoseconds>(
                  currentTime() - startTime
               ).count() / 1000000000.0;
    }
    std::chrono::time_point<std::chrono::steady_clock> startTime;
};

使用示例:

// global
Timer stopwatch;

// when the player does first input (or whenever)
stopwatch.reset();

// in your loop
double stopwatchSeconds = stopwatch.getElapsed();
// display the value...