我的C ++游戏的C ++计时器

时间:2014-10-22 22:55:30

标签: c++

我遇到了一个很大的问题!我正在制作一个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,但是它有效!但它仍然冻结了我程序中的其他一切!

如果您需要什么,请告诉我!

1 个答案:

答案 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(&currentTime);
      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);
  }
};