C++ 中的处理时间
Handling time in C++
我正在写一个模拟程序。我在处理时间时遇到了一些困难。
我的程序有一个时间段和一个总运行时间变量。我有红绿灯对象。当经过的时间是周期的整数倍时,我想改变它们的颜色。例如,假设总时间从 0 开始到 60 秒结束,周期为 10 秒。因此,当时间为 10、20、30 等时,应更改颜色。
我尝试使用简单的数学来解决这个问题,但是当我绘制对象时没有任何改变。那么,我该如何处理更改颜色的时间?
您可以将 delay(milliseconds)
与头文件 #include<dos.h>
一起使用。例如,如果你希望你的红绿灯在 60 秒内每 10 秒更换一次,你可以执行以下代码:
for(int i = 0; i < 6; i ++)
{
changeColor();
delay(1000);
}
此外,您可以使用 sleep()
。您可能会在这里找到问题的答案:
http://www.cplusplus.com/forum/beginner/13906/
您可以使用标准 <chrono>
库,但 SFML 有自己的一套时间处理工具。您不需要任何复杂的计算或线程。您需要的部分简化示例:
#include <SFML/Graphics.hpp>
#include <vector>
class Light : public sf::CircleShape {
public:
Light(std::vector<sf::Color> cols, sf::Time period)
:colors{ cols }, colorIdx{ 0 }, changePeriod{ period }
{
setRadius(100);
}
void update(sf::Time deltaTime) {
elapsedTime += deltaTime;
while (elapsedTime >= changePeriod) {
elapsedTime -= changePeriod;
changeColor();
}
setColor();
}
protected:
void changeColor() {
if (++colorIdx == colors.size()) {
colorIdx = 0;
}
}
void setColor() {
setFillColor(colors[colorIdx]);
}
private:
std::vector<sf::Color> colors;
std::size_t colorIdx;
sf::Time changePeriod;
sf::Time elapsedTime;
};
int main() {
Light light1({sf::Color::Red, sf::Color::Yellow, sf::Color::Green}, sf::seconds(1));
Light light2({sf::Color::Red, sf::Color::Green}, sf::milliseconds(200));
light2.setPosition(300, 300);
light2.setRadius(20);
sf::RenderWindow window(sf::VideoMode(400, 400), "");
sf::Event event;
sf::Clock clock;
while (window.isOpen()) {
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) window.close();
}
sf::Time dt = clock.restart();
light1.update(dt);
light2.update(dt);
window.clear();
window.draw(light1);
window.draw(light2);
window.display();
}
}
我正在写一个模拟程序。我在处理时间时遇到了一些困难。
我的程序有一个时间段和一个总运行时间变量。我有红绿灯对象。当经过的时间是周期的整数倍时,我想改变它们的颜色。例如,假设总时间从 0 开始到 60 秒结束,周期为 10 秒。因此,当时间为 10、20、30 等时,应更改颜色。
我尝试使用简单的数学来解决这个问题,但是当我绘制对象时没有任何改变。那么,我该如何处理更改颜色的时间?
您可以将 delay(milliseconds)
与头文件 #include<dos.h>
一起使用。例如,如果你希望你的红绿灯在 60 秒内每 10 秒更换一次,你可以执行以下代码:
for(int i = 0; i < 6; i ++)
{
changeColor();
delay(1000);
}
此外,您可以使用 sleep()
。您可能会在这里找到问题的答案:
http://www.cplusplus.com/forum/beginner/13906/
您可以使用标准 <chrono>
库,但 SFML 有自己的一套时间处理工具。您不需要任何复杂的计算或线程。您需要的部分简化示例:
#include <SFML/Graphics.hpp>
#include <vector>
class Light : public sf::CircleShape {
public:
Light(std::vector<sf::Color> cols, sf::Time period)
:colors{ cols }, colorIdx{ 0 }, changePeriod{ period }
{
setRadius(100);
}
void update(sf::Time deltaTime) {
elapsedTime += deltaTime;
while (elapsedTime >= changePeriod) {
elapsedTime -= changePeriod;
changeColor();
}
setColor();
}
protected:
void changeColor() {
if (++colorIdx == colors.size()) {
colorIdx = 0;
}
}
void setColor() {
setFillColor(colors[colorIdx]);
}
private:
std::vector<sf::Color> colors;
std::size_t colorIdx;
sf::Time changePeriod;
sf::Time elapsedTime;
};
int main() {
Light light1({sf::Color::Red, sf::Color::Yellow, sf::Color::Green}, sf::seconds(1));
Light light2({sf::Color::Red, sf::Color::Green}, sf::milliseconds(200));
light2.setPosition(300, 300);
light2.setRadius(20);
sf::RenderWindow window(sf::VideoMode(400, 400), "");
sf::Event event;
sf::Clock clock;
while (window.isOpen()) {
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) window.close();
}
sf::Time dt = clock.restart();
light1.update(dt);
light2.update(dt);
window.clear();
window.draw(light1);
window.draw(light2);
window.display();
}
}