OpenGL和SFML Clock无法正确重启

时间:2018-03-31 20:12:18

标签: c++ opengl sfml

我目前正在使用OpenGL制作迷宫游戏。

我想创建一个计时器来跟踪用户花在完成每个迷宫上的时间。我正在使用SFML时钟来试着跟踪这个时间。

我为第一个迷宫设置了以下内容: maze.draw();

    if(mazeOneIteration == 1){
        mazeOneIteration++;
        mazeOneClock.restart();
    }
    char timeStr1[100];
    char levelStr[100];


    sprintf(levelStr, "Level: %d", levelNum);
    sprintf(timeStr1, "Time: %.2fs", mazeOneClock.getElapsedTime().asSeconds());

    //std::cout << timeStr1 << std::endl;
    std::cout << mazeOneClock.getElapsedTime().asSeconds() << std::endl;

    glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(glm::mat4(1.0)));

    box.draw();

    text.setFontSize(20);
    text.draw("User: zsloan112" , 20, 15);
    text.draw(levelStr, getSize().x - 100, getSize().y - 20);
    text.draw(timeStr1, 20, getSize().y - 20);

由于这是在我的游戏循环中运行,这段代码每秒运行60次,所以我只有一次重启并在第一次运行时将时钟设置为0,因此if语句重启时钟。

我的问题是,当我使用sprintf将时间插入timeStr1时,显示时间保持为0秒。

如果第一次执行此代码块,我将如何正确重启时钟,然后继续计算时间?

1 个答案:

答案 0 :(得分:0)

我将对您的代码提出一些批评。我在申请工作的地方向我展示了这段代码,我不会雇用你。

您使用sprintf。这是一个特别糟糕的迹象。您不仅使用sprintf,而且还使用固定大小的char数组。虽然在这个例子中它可能会很好,但它表明了一个更深层次的问题。在C ++中,你应该从不找到任何s*printf函数 - 它根本没用。而只是使用std::string。它将允许您在没有任何潜在问题的情况下完成所需的操作:

替换:

char timeStr1[100];
char levelStr[100];


sprintf(levelStr, "Level: %d", levelNum);
sprintf(timeStr1, "Time: %.2fs", mazeOneClock.getElapsedTime().asSeconds());

使用:

auto const levelStr = "Level: "s + std::to_string(level);
auto const timeStr1 = "Time: "s + mazeOneClock.getElapsedTime().asSeconds();

其次,查看std::chrono。不是因为它说的更好,而仅仅因为它是标准库的一部分。 SFML是从std::chrono之前存在的,所以它有自己的时钟就不足为奇了,但是当你没有理由不去时,你应该坚持使用标准库。

当您尝试衡量已用时间时,std::chrono::steady_clock应该是您的默认选项。

要阅读的内容:

  1. http://en.cppreference.com/w/cpp/string
  2. http://en.cppreference.com/w/cpp/chrono/steady_clock