OpenGL和SFML时钟未正确重新启动

OpenGL and SFML Clock not restarting correctly

本文关键字:重新启动 时钟 SFML OpenGL      更新时间:2023-10-16

我目前正在使用OpenGL进行迷宫游戏。

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

我对第一个迷宫设置了以下设置:迷宫。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秒时。

第一次执行此块,然后继续计数时间?

,我将如何使时钟正确重新启动?

我将在您的代码上向您提供一些批评。我在申请工作并向我展示此代码的地方,我不会雇用您。

您使用sprintf。这是一个特别糟糕的信号。您不仅使用sprintf,还使用固定尺寸的字符阵列。虽然在此示例中可能会很好,但它表明了一个更深的问题。在C 中,您应该永远不要找到任何s*printf函数 - 根本没有用。而是使用std::string。如果没有任何潜在问题,它将允许您确切地完成所需的工作:

替换:

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

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

with:

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