每5秒增加一个值

时间:2018-10-24 18:54:50

标签: c++

我正在控制台中制作一个简单的流星和火箭游戏。我想每五秒钟增加流星的产生率。我已经尝试过Sleep()函数,但这当然无法正常工作并使整个应用程序进入睡眠状态。 while循环也是如此。

我只会将Logic()函数发布在必须增加的地方,因为它是一个程序
大概有100行,我不想在这里发布所有内容。如果您确实需要背景信息,请问我,我会发布所有内容。

void Logic() {
        Sleep(5000); // TODO Increase meteors every Five seconds
        nMeteors++;
}

我对此很固执,所以如果有人可以帮助我,那将是一件好事:)

4 个答案:

答案 0 :(得分:1)

编写游戏的典型方法是具有事件循环。

事件循环轮询各种输入的状态,更新游戏的状态,然后重复执行。一些聪明的事件循环甚至会短暂睡眠,并在输入更改或状态必须更新时得到通知。

在流星生成代码中,跟踪上一次生成速率增加时的时间戳。当您检查流星是否应该在此点后5秒钟生成或生成流星时,请更新生成速率并记录新的时间戳记(可能是追溯性的,并且可能出于某种原因循环处理两次检查之间经过的10秒钟以上)。 / p>

可能有涉及额外执行线程的替代解决方案,但这不是一个好主意。

顺便说一句,大多数游戏都希望支持暂停;因此您要区分挂钟时间和标称游戏时间。

答案 1 :(得分:1)

主要有两种方法可以解决此问题。一种方法是产生一个新线程并在其中放置循环。您可以使用C ++ 11的标准库<chronostd::this_thread::sleep_for(std::chrono::seconds{5});。将线程休眠5秒钟就像std::chrono::time_point<std::chrono::steady_clock> previous_time = std::chrono::steady_clock::now();

一样简单

但是没有必要将整个线程专门用于这种琐碎的任务。在视频游戏中,您通常会在某种程度上保持时间变化。

您想要做的可能是在循环外有一个变量auto previous_time = std::chrono::steady_clock::now()(或简称为auto current_time = std::chrono::steady_clock::now();)。现在,您有了一个参考点,可以用来知道运行循环时的时间。在循环内部,您将创建另一个变量,例如current_time,这是您的当前时间。现在,只需计算一下previous_timeprevious_time = current_time;之间的差异,然后检查是否经过了5秒钟。如果有,请增加变量,不要忘记设置if (std::chrono::duration_cast<std::chrono::seconds>(current_time - previous_time).count() >= 5) { ... }来更新时间,否则请跳过并继续执行主游戏循环中需要做的其他事情。

要检查是否已过去5秒钟,请执行chrono

对于thread库,您可以找到更多信息here;对于{{1}}库,您可以找到here更多信息。另外,Google是您的朋友。

答案 2 :(得分:0)

我发现这比使用chrono容易

接受反馈:

代码:-

包括“ time.h”

main(){

int d;

time_t s,e;

time(&s);

time(&e);

d=e-s;

while(d<5){

    cout<<d;

    time(&e);

    d=e-s;

}

}

答案 3 :(得分:0)

一种实现此目的的方法是,将值设为经过时间的函数。例如:

// somewhere to store the beginning of the 
// time period.
inline std::time_t& get_start_timer()
{
    static std::time_t t{};
    return t;
}

// Start a time period (resets meteors to zero)
inline void start_timer()
{
    get_start_timer() = std::time(nullptr); // current time in seconds
}

// retrieve the current number of meteors
// as a function of time.
inline int nMeteors()
{
    return int(std::difftime(std::time(nullptr), get_start_timer())) / 5;
}

int main()
{
    start_timer();

    for(;;)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout << "meteors: " << nMeteors() << '\n';
    }
}

以下是使用C++11 <chrono>库的类似版本:

// somewhere to store the beginning of the
// time period.
inline auto& get_time_point()
{
    static std::chrono::steady_clock::time_point tp{};
    return tp;
}

// Start a time period (resets meteors to zero)
inline void start_timing()
{
    get_time_point() = std::chrono::steady_clock::now(); // current time in seconds
}

// retrieve the current number of meteors
// as a function of time.
inline auto nMeteors()
{
    return std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - get_time_point()).count() / 5;
}

int main()
{
    start_timing();

    for(;;)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout << "meteors: " << nMeteors() << '\n';
    }
}