我正在控制台中制作一个简单的流星和火箭游戏。我想每五秒钟增加流星的产生率。我已经尝试过Sleep()函数,但这当然无法正常工作并使整个应用程序进入睡眠状态。 while循环也是如此。
我只会将Logic()函数发布在必须增加的地方,因为它是一个程序
大概有100行,我不想在这里发布所有内容。如果您确实需要背景信息,请问我,我会发布所有内容。
void Logic() {
Sleep(5000); // TODO Increase meteors every Five seconds
nMeteors++;
}
我对此很固执,所以如果有人可以帮助我,那将是一件好事:)
答案 0 :(得分:1)
编写游戏的典型方法是具有事件循环。
事件循环轮询各种输入的状态,更新游戏的状态,然后重复执行。一些聪明的事件循环甚至会短暂睡眠,并在输入更改或状态必须更新时得到通知。
在流星生成代码中,跟踪上一次生成速率增加时的时间戳。当您检查流星是否应该在此点后5秒钟生成或生成流星时,请更新生成速率并记录新的时间戳记(可能是追溯性的,并且可能出于某种原因循环处理两次检查之间经过的10秒钟以上)。 / p>
可能有涉及额外执行线程的替代解决方案,但这不是一个好主意。
顺便说一句,大多数游戏都希望支持暂停;因此您要区分挂钟时间和标称游戏时间。
答案 1 :(得分:1)
主要有两种方法可以解决此问题。一种方法是产生一个新线程并在其中放置循环。您可以使用C ++ 11的标准库<chrono
和std::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_time
和previous_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';
}
}