我遇到了一个很大的问题!我正在制作一个C ++ Zombie游戏,除了屏障部分之外它还能完美运行。我希望僵尸来到障碍物,然后让他们等待大约5秒钟,然后突破障碍物。现在我认为你不需要我的全部代码,因为它只是一个计时器,但如果你让我知道!基本上,我尝试了许多计时器和睡眠命令,但是当我使用它们时它会让僵尸停留在障碍物上,但随后其他一切都会冻结,直到计时器。例如,如果屏障的僵尸和我使用计时器5秒钟,僵尸停留在屏障5秒!但其他一切都没有,其他任何东西都不能移动5秒!他们是否可以使用睡眠命令仅用于我的代码的某些部分?这是我用过的少数计时器之一。
int Timer()
{
int s = 0;
int m = 0;
int h = 0;
while (true)
{
CPos(12,58);
cout << "Timer: ";
cout << h/3600 << ":" << m/60 << ":" << s;
if (s == 59) s = -1;
if (m == 3599) m = -1; //3599 = 60*60 -1
s++;
m++;
h++;
Sleep(1000);
cout<<"\b\b\b";
}
}
这个涉及一个睡眠命令,我也使用了一个计时器,其中while(number> 0) - number,但是它有效!但它仍然冻结了我程序中的其他一切!
如果您需要什么,请告诉我!
答案 0 :(得分:0)
除非你有EACH僵尸和其他一切在不同线程上运行,否则调用Sleep会暂停整个应用程序x毫秒......你需要以不同的方式停止僵尸,即直到时间过去才移动他,同时仍然正常更新其他实体(不要使用睡眠)。
编辑:
您不能只创建一个计时器,然后等到该计时器完成。当僵尸需要停止移动时,你必须“记住”当前时间,但继续。然后每当你再次回到那个僵尸来更新它的位置时,你会检查他是否有一个暂停计时器。如果他这样做,那么你必须比较你记得的时间与当前时间之间的经过时间,并检查他是否已经停顿了足够长的时间......这里有一些伪代码:
#include <time>
class Zombie {
private:
int m_xPos;
time_t m_rememberedTime;
public:
Zombie() {
this->m_xPos = 0;
this->m_rememberedTime = 0;
}
void Update() {
if (CheckPaused()) {
// bail out before we move this zombie if he is paused at a barrier.
return;
}
// If it's not paused, then move him as normal.
this->m_xPos += 1; // or whatever.
if (ZombieHitBarrier()) {
PauseZombieAtBarrier();
}
}
bool CheckPaused() {
if (this.m_rememberedTime > 0) {
// If we have a remembered time, calculate the elapsed time.
time_t currentTime;
time(¤tTime);
time_t elapsed = currentTime - this.m_rememberedTime;
if (elapsed > 5.0f) {
// 5 seconds has gone by, so clear the remembered time and continue on to return false.
this.m_rememberedTime = 0;
} else {
// 5 seconds has not gone by yet, so return true that we are still paused.
return true;
}
}
// Either no timer exists, or the timer has just finished, return false that we are not paused.
return false;
}
// Call this when the zombie hits a wall.
void PauseZombieAtBarrier() {
// Store the current time in a variable for later use.
time(&this->m_rememberedTime);
}
};