我目前正在使用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秒。
如果第一次执行此代码块,我将如何正确重启时钟,然后继续计算时间?
答案 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
应该是您的默认选项。
要阅读的内容: