繁体   English   中英

OpenGL和SFML Clock无法正确重启

[英]OpenGL and SFML Clock not restarting correctly

我目前正在使用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秒。

第一次执行此代码块后,如何获得时钟以正确重新启动时钟,然后继续计时?

我将为您的代码提供一些批评。 我是您在哪里找工作并向我显示了此代码,我不会雇用您。

您正在使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM