Вариантов отобразить электронные часы на языке программирования С++ очень множество, в данной статье рассмотрим электронные часы для 2D игр написанных используя мультимедийную библиотеку SFML. Для удобства дальнейшего внедрения данного кода в наши проекты создадим класс электронные часы, в котором реализуем возможность менять шрифт, размер и цвет электронных часов.
Для написания кода нам понадобится IDE Visual Studio, С++ проект с настроенной библиотекой SFML, шаблон кода SFML, иконки и шрифты.
Шаблон кода SFML C++
#include <SFML/Graphics.hpp>
using namespace sf;
int main()
{
// Графическое окно размером 900х900 с названием "Часы"
RenderWindow window(VideoMode(900, 900), L"Часы", Style::Default);
// Иконка графического окна
Image icon;
if (!icon.loadFromFile("Image/clock.png")) //Загрузка иконки
{
return 3; // Возвращает 3 если иконка не загрузилась
}
window.setIcon(128, 128, icon.getPixelsPtr()); // Ссылка на иконку
// Рабочий цикл графического окна
while (window.isOpen())
{
// Переменная для хранения события
Event event;
// Цикл обработки событий
while (window.pollEvent(event))
{
// Обработка события нажатия на крестик графического окна
if (event.type == Event::Closed) window.close();
}
// Очистка графического окна, с окраской фона в синий цвет
window.clear(Color::Blue);
// Вывод графики в графическое окно
window.display();
}
return 0;
}
Если Вы с первой часть справились успешно, тогда можем добавить к нашему проекту новый класс назовём его SFMLWorldTime.
Объявление закрытых свойств класса SFMLWorldTime, файл SFMLWorldTime.h
#pragma once
#include <SFML/Graphics.hpp>
class SFMLWorldTime
{
struct tm newtime;
__time64_t long_time;
errno_t err;
int position_x, position_y;
int font_size;
sf::Font time_font;
sf::Color time_color;
sf::Text clock_text;
};
newtime содержит необходимые поля для отображения времени: часы, минуты и секунды. long_time - переменная системного времени. err - сохраняет код ошибки при неверном подключении времени.
position_x, position_y - координаты электронных часов.
font_size - размер шрифта электронных часов.
time_font - хранит шрифт электронных часов. Переменная time_color хранит цвет электронных часов. clock_text - текстовый объект, который рисует элементы электронных часов в графическом окне.
Объявление закрытых методов класса SFMLWorldTime, файл SFMLWorldTime.h
void InitText();
void what_time();
Метод InitText устанавливает настройки объекта clock_text.
Метод what_time записывает текущее системное время в структуру newtime.
Определение закрытых методов класса SFMLWorldTime, файл SFMLWorldTime.cpp
void SFMLWorldTime::InitText()
{
clock_text.setFont(time_font); // тип шрифта
clock_text.setCharacterSize(font_size); // размер шрифта
clock_text.setFillColor(time_color); // цвет шрифта
}
void SFMLWorldTime::what_time()
{
_time64(&long_time); // получаем системное время
// записываем системное время в структуру newtime
err = _localtime64_s(&newtime, &long_time);
if (err) exit(23); // при возникновении ошибки выходим из программы и возвращаем код ошибки 23
}
Объявление конструктора класса SFMLWorldTime, файл SFMLWorldTime.h
public:
SFMLWorldTime(int x = 50, int y = 50, int size = 3, sf::Color mycolor = sf::Color::White, std::string font = "lib/Электро.ttf");
Определение конструктора класса SFMLWorldTime, файл SFMLWorldTime.cpp
SFMLWorldTime::SFMLWorldTime(int x, int y, int size, sf::Color mycolor, std::string font)
{
(size > 10) ? size = 10 : (size < 1) ? size = 1 : size = size;
position_x = x;
position_y = y;
if (!time_font.loadFromFile(font)) exit(13);
time_color = mycolor;
font_size = size * 10;
InitText();
}
Объявление открытых методов класса SFMLWorldTime, файл SFMLWorldTime.h
void setposition(int x, int y);
void setcolor(sf::Color color);
void setTime_size(int size);
int getsec();
int getmin();
int gethour();
void drawTime(sf::RenderWindow& window);
Методы: setposition, setcolor, setTime_size устанавливаю свойства электронных часов, координаты, цвет и размер.
Методы: getsec, getmin, gethour, возвращаю целочисленное значение системного времени секунды, минуты, часы.
Метод drawTime рисует электронные часы в графическом окне. В параметрах передаётся объект графическое окно.
Определение открытых методов класса SFMLWorldTime, файл SFMLWorldTime.cpp
void SFMLWorldTime::setposition(int x, int y)
{
position_x = x;
position_y = y;
}
void SFMLWorldTime::setcolor(sf::Color color)
{
time_color = color;
InitText();
}
void SFMLWorldTime::setTime_size(int size)
{
(size > 10) ? size = 10 : (size < 1) ? size = 1 : size = size;
font_size = size * 10;
InitText();
}
int SFMLWorldTime::getsec()
{
what_time(); // обновление свойств структуры newtime
return newtime.tm_sec;
}
int SFMLWorldTime::getmin()
{
what_time();
return newtime.tm_min;
}
int SFMLWorldTime::gethour()
{
what_time();
return newtime.tm_hour;
}
Определение метода drawTime
void SFMLWorldTime::drawTime(sf::RenderWindow& window)
{
what_time();
std::string tmpstr;
if (newtime.tm_hour < 10)
{
tmpstr = "0";
tmpstr.append(std::to_string(newtime.tm_hour));
}
else tmpstr = std::to_string(newtime.tm_hour);
tmpstr.append(":");
if (newtime.tm_min < 10) tmpstr.append("0");
tmpstr.append(std::to_string(newtime.tm_min));
tmpstr.append(":");
if (newtime.tm_sec < 10) tmpstr.append("0");
tmpstr.append(std::to_string(newtime.tm_sec));
clock_text.setPosition(position_x, position_y);
clock_text.setString(tmpstr);
window.draw(clock_text);
}
В методе drawTime проверяется условие для отображения элементов электронных часов, если элемент, например секунды меньше 10, тогда к нему добавляется ноль, который устанавливается перед секундами. Все элементы электронных часов склеиваются в одну строку с помощью метода append() и сохраняются в переменную tmpstr. Функция to_string() переводит целое значение в строковое.
После формирования строки с электронными часами, она выводится в графическое окно с помощью объекта window и метода draw().
Объект электронные часы SFMLWorldTime.
В функции main объявляем тип SFMLWorldTime (электронные часы) и с помощью цикла for выводим в графическое окно 10 электронных часов разных размеров.
#include "SFMLWorldTime.h"
using namespace sf;
int main()
{
RenderWindow window(VideoMode(900, 900), L"Часы", Style::Default);
Image icon;
if (!icon.loadFromFile("Image/clock.png"))
{
return 3;
}
window.setIcon(128, 128, icon.getPixelsPtr());
SFMLWorldTime mytime(50,50,4);
mytime.setcolor(Color::Yellow);
while (window.isOpen())
{
Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed) window.close();
}
window.clear(Color::Blue);
for (int i = 10, kof = 0, kof2 = 20, posy = 50, posx = 200; i > 0; i--,
kof += 10, posy += 130 - kof, kof -= 2, posx += kof2)
{
mytime.setTime_size(i);
mytime.setposition(posx, posy);
mytime.drawTime(window);
}
window.display();
}
return 0;
}
Полный код файла SFMLWorldTime.h
#pragma once
#include <SFML/Graphics.hpp>
class SFMLWorldTime
{
struct tm newtime;
__time64_t long_time;
errno_t err;
int position_x, position_y;
int font_size;
sf::Font time_font;
sf::Color time_color;
sf::Text clock_text;
void InitText();
void what_time();
public:
SFMLWorldTime(int x = 50, int y = 50, int size = 3, sf::Color mycolor = sf::Color::White, std::string font = "lib/Электро.ttf");
void setposition(int x, int y);
void setcolor(sf::Color color);
void setTime_size(int size);
int getsec();
int getmin();
int gethour();
void drawTime(sf::RenderWindow& window);
};
Полный код файла SFMLWorldTime.cpp
#include "SFMLWorldTime.h"
SFMLWorldTime::SFMLWorldTime(int x, int y, int size, sf::Color mycolor, std::string font)
{
(size > 10) ? size = 10 : (size < 1) ? size = 1 : size = size;
position_x = x;
position_y = y;
if (!time_font.loadFromFile(font)) exit(13);
time_color = mycolor;
font_size = size * 10;
InitText();
}
void SFMLWorldTime::drawTime(sf::RenderWindow& window)
{
what_time();
std::string tmpstr;
if (newtime.tm_hour < 10)
{
tmpstr = "0";
tmpstr.append(std::to_string(newtime.tm_hour));
}
else tmpstr = std::to_string(newtime.tm_hour);
tmpstr.append(":");
if (newtime.tm_min < 10) tmpstr.append("0");
tmpstr.append(std::to_string(newtime.tm_min));
tmpstr.append(":");
if (newtime.tm_sec < 10) tmpstr.append("0");
tmpstr.append(std::to_string(newtime.tm_sec));
clock_text.setPosition(position_x, position_y);
clock_text.setString(tmpstr);
window.draw(clock_text);
}
void SFMLWorldTime::InitText()
{
clock_text.setFont(time_font);
clock_text.setCharacterSize(font_size);
clock_text.setFillColor(time_color);
}
void SFMLWorldTime::what_time()
{
_time64(&long_time);
err = _localtime64_s(&newtime, &long_time);
if (err) exit(23);
}
void SFMLWorldTime::setposition(int x, int y)
{
position_x = x;
position_y = y;
}
void SFMLWorldTime::setcolor(sf::Color color)
{
time_color = color;
InitText();
}
void SFMLWorldTime::setTime_size(int size)
{
(size > 10) ? size = 10 : (size < 1) ? size = 1 : size = size;
font_size = size * 10;
InitText();
}
int SFMLWorldTime::getsec()
{
what_time();
return newtime.tm_sec;
}
int SFMLWorldTime::getmin()
{
what_time();
return newtime.tm_min;
}
int SFMLWorldTime::gethour()
{
what_time();
return newtime.tm_hour;
}
Более подробную инструкцию вы можете получить посмотрев видео "Электронные часы SFML C++".