
Вариантов отобразить электронные часы на языке программирования С++ очень множество, в данной статье рассмотрим электронные часы для 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
#include <SFML/Graphics.hpp> using namespace sf; using namespace std; class SFMLWorldTime { struct tm newtime; __time64_t long_time; errno_t err; int position_x, position_y; int font_size, font_step; Font time_font; Color time_color; Text clock_text; int pos[11][7]{ {0,0,0,0,0,0,0},{19,25,45,52,60,35,10}, {35,45,82,95,110,62,15}, {49,60,109,120,142,82,22}, {65,80,145,160,190,110,32}, {78,95,175,195,230,133,37}, {90,105,200,215,260,153,43} ,{105,125,230,250,305,175,50}, {120,140,260,280,340,195,60},{138,160,295,320,390,225,70},{148,175,325,350,430,250,75} }; };
newtime содержит необходимые поля для отображения времени: часы, минуты и секунды. long_time — переменная системного времени. err — сохраняет код ошибки при неверном подключении времени.
position_x, position_y — координаты электронных часов.
font_size — размер шрифта электронных часов.
font_step — шаг перемещения по массиву pos в котором устанавливаются координаты элементов при изменении размера электронных часов.




Электронные часы состоят из 8 элементов для которых устанавливаются координаты при масштабировании. В массиве pos прописаны координаты для семи элементов так как часовой измеритель берёт основные координаты position_x, position_y.
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(); SFMLWorldTime(string font); // устанавливаем шрифт SFMLWorldTime(string font, int x, int y);// устанавливаем шрифт и координаты SFMLWorldTime(string font, int x, int y, int size); // устанавливаем шрифт, координаты и размер // устанавливаем шрифт, координаты, размер и цвет электронных часов SFMLWorldTime(string font, int x, int y, int size, Color mycolor); SFMLWorldTime(int x, int y); // устанавливаем координаты SFMLWorldTime(int x, int y, int size); // устанавливаем координаты и размер SFMLWorldTime(int x, int y, int size, Color mycolor);// устанавливаем координаты, размер и цвет
Определение конструкторов класса SFMLWorldTime, файл SFMLWorldTime.cpp
SFMLWorldTime::SFMLWorldTime() { position_x = 0; position_y = 0; if (!time_font.loadFromFile("lib/Электро.ttf")) exit(13); time_color = Color::White; font_size = 30; font_step = 3; InitText(); } SFMLWorldTime::SFMLWorldTime(int x, int y) { position_x = x; position_y = y; if (!time_font.loadFromFile("lib/Электро.ttf")) exit(13); time_color = Color::White; font_size = 30; font_step = 3; InitText(); } SFMLWorldTime::SFMLWorldTime(int x, int y, int size) { (size > 10) ? size = 10 : (size < 1) ? size = 1 : size = size; position_x = x; position_y = y; if (!time_font.loadFromFile("lib/Электро.ttf")) exit(13); time_color = Color::White; font_size = size * 10; font_step = size; InitText(); } SFMLWorldTime::SFMLWorldTime(int x, int y, int size, Color mycolor) { (size > 10) ? size = 10 : (size < 1) ? size = 1 : size = size; position_x = x; position_y = y; if (!time_font.loadFromFile("lib/Электро.ttf")) exit(13); time_color = mycolor; font_size = size * 10; font_step = size; InitText(); } SFMLWorldTime::SFMLWorldTime(string font) { position_x = 0; position_y = 0; if (!time_font.loadFromFile(font)) exit(13); time_color = Color::White; font_size = 30; font_step = 3; InitText(); } SFMLWorldTime::SFMLWorldTime(string font, int x, int y) { position_x = x; position_y = y; if (!time_font.loadFromFile(font)) exit(13); time_color = Color::White; font_size = 30; font_step = 3; InitText(); } SFMLWorldTime::SFMLWorldTime(string font, int x, int y, int size) { (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 = Color::White; font_size = size * 10; font_step = size; InitText(); } SFMLWorldTime::SFMLWorldTime(string font, int x, int y, int size, Color mycolor) { (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; font_step = size; InitText(); }
Объявление открытых методов класса SFMLWorldTime, файл SFMLWorldTime.h
void setposition(int x, int y); void setcolor(Color color); void setTime_size(int size); int getsec(); int getmin(); int gethour(); void drawTime(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(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; font_step = size; 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(RenderWindow& window) { what_time // обновление свойств структуры newtime(); if (newtime.tm_hour < 10) { clock_text.setPosition(position_x, position_y); clock_text.setString("0"); window.draw(clock_text); clock_text.setPosition(pos[font_step][6] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_hour)); window.draw(clock_text); } else { clock_text.setPosition(position_x, position_y); clock_text.setString(IntToString(newtime.tm_hour)); window.draw(clock_text); } clock_text.setPosition(pos[font_step][0] + position_x, position_y); clock_text.setString(":"); window.draw(clock_text); if (newtime.tm_min < 10) { clock_text.setPosition(pos[font_step][1] + position_x, position_y); clock_text.setString("0"); window.draw(clock_text); clock_text.setPosition(pos[font_step][5] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_min)); window.draw(clock_text); } else { clock_text.setPosition(pos[font_step][1] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_min)); window.draw(clock_text); } clock_text.setPosition(pos[font_step][2] + position_x, position_y); clock_text.setString(":"); window.draw(clock_text); if (newtime.tm_sec < 10) { clock_text.setPosition(pos[font_step][3] + position_x, position_y); clock_text.setString("0"); window.draw(clock_text); clock_text.setPosition(pos[font_step][4] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_sec)); window.draw(clock_text); } else { clock_text.setPosition(pos[font_step][3] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_sec)); window.draw(clock_text); } }
В методе drawTime проверяется условие для отображения элементов часов, если элемент часов например секунды меньше 10, тогда в элемент включается ноль, который устанавливается перед секундами. После установки значения элемента и его координат он рисуется в графическом окне с помощью объекта и метода window.draw().
Для перевода целого значения времени в строковое используем отдельную пользовательскую функцию IntToString() (не входит в состав методов класса SFMLWorldTime). Эту функцию мы объявим в файле SFMLWorldTime.h
string IntToString(int number);
А также подключим заголовочный файл #include <sstream> для работы объектов в определении функции IntToString.
В параметре функции IntToString вводим целое значение на выходе получаем строковое.
Определим данную функцию в файле SFMLWorldTime.cpp
string IntToString(int number) { ostringstream TextString; TextString << number; return TextString.str(); }
Объект TextString будет работать при условии подключения заголовочного файла #include <sstream> в файле SFMLWorldTime.h
Объект электронные часы 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> #include <sstream> using namespace sf; using namespace std; class SFMLWorldTime { struct tm newtime; __time64_t long_time; errno_t err; int position_x, position_y; int font_size, font_step; Font time_font; Color time_color; Text clock_text; int pos[11][7]{ {0,0,0,0,0,0,0},{19,25,45,52,60,35,10}, {35,45,82,95,110,62,15}, {49,60,109,120,142,82,22}, {65,80,145,160,190,110,32}, {78,95,175,195,230,133,37}, {90,105,200,215,260,153,43} ,{105,125,230,250,305,175,50}, {120,140,260,280,340,195,60},{138,160,295,320,390,225,70},{148,175,325,350,430,250,75} }; void InitText(); void what_time(); public: SFMLWorldTime(); SFMLWorldTime(string font); SFMLWorldTime(string font, int x, int y); SFMLWorldTime(string font, int x, int y, int size); SFMLWorldTime(string font, int x, int y, int size, Color mycolor); SFMLWorldTime(int x, int y); SFMLWorldTime(int x, int y, int size); SFMLWorldTime(int x, int y, int size, Color mycolor); void setposition(int x, int y); void setcolor(Color color); void setTime_size(int size); int getsec(); int getmin(); int gethour(); void drawTime(RenderWindow& window); }; string IntToString(int number);
Полный код файла SFMLWorldTime.cpp
#include "SFMLWorldTime.h" SFMLWorldTime::SFMLWorldTime() { position_x = 0; position_y = 0; if (!time_font.loadFromFile("lib/Электро.ttf")) exit(13); time_color = Color::White; font_size = 30; font_step = 3; InitText(); } SFMLWorldTime::SFMLWorldTime(int x, int y) { position_x = x; position_y = y; if (!time_font.loadFromFile("lib/Электро.ttf")) exit(13); time_color = Color::White; font_size = 30; font_step = 3; InitText(); } SFMLWorldTime::SFMLWorldTime(int x, int y, int size) { (size > 10) ? size = 10 : (size < 1) ? size = 1 : size = size; position_x = x; position_y = y; if (!time_font.loadFromFile("lib/Электро.ttf")) exit(13); time_color = Color::White; font_size = size * 10; font_step = size; InitText(); } SFMLWorldTime::SFMLWorldTime(int x, int y, int size, Color mycolor) { (size > 10) ? size = 10 : (size < 1) ? size = 1 : size = size; position_x = x; position_y = y; if (!time_font.loadFromFile("lib/Электро.ttf")) exit(13); time_color = mycolor; font_size = size * 10; font_step = size; InitText(); } SFMLWorldTime::SFMLWorldTime(string font) { position_x = 0; position_y = 0; if (!time_font.loadFromFile(font)) exit(13); time_color = Color::White; font_size = 30; font_step = 3; InitText(); } SFMLWorldTime::SFMLWorldTime(string font, int x, int y) { position_x = x; position_y = y; if (!time_font.loadFromFile(font)) exit(13); time_color = Color::White; font_size = 30; font_step = 3; InitText(); } SFMLWorldTime::SFMLWorldTime(string font, int x, int y, int size) { (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 = Color::White; font_size = size * 10; font_step = size; InitText(); } SFMLWorldTime::SFMLWorldTime(string font, int x, int y, int size, Color mycolor) { (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; font_step = size; InitText(); } void SFMLWorldTime::drawTime(RenderWindow& window) { what_time(); if (newtime.tm_hour < 10) { clock_text.setPosition(position_x, position_y); clock_text.setString("0"); window.draw(clock_text); clock_text.setPosition(pos[font_step][6] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_hour)); window.draw(clock_text); } else { clock_text.setPosition(position_x, position_y); clock_text.setString(IntToString(newtime.tm_hour)); window.draw(clock_text); } clock_text.setPosition(pos[font_step][0] + position_x, position_y); clock_text.setString(":"); window.draw(clock_text); if (newtime.tm_min < 10) { clock_text.setPosition(pos[font_step][1] + position_x, position_y); clock_text.setString("0"); window.draw(clock_text); clock_text.setPosition(pos[font_step][5] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_min)); window.draw(clock_text); } else { clock_text.setPosition(pos[font_step][1] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_min)); window.draw(clock_text); } clock_text.setPosition(pos[font_step][2] + position_x, position_y); clock_text.setString(":"); window.draw(clock_text); if (newtime.tm_sec < 10) { clock_text.setPosition(pos[font_step][3] + position_x, position_y); clock_text.setString("0"); window.draw(clock_text); clock_text.setPosition(pos[font_step][4] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_sec)); window.draw(clock_text); } else { clock_text.setPosition(pos[font_step][3] + position_x, position_y); clock_text.setString(IntToString(newtime.tm_sec)); 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(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; font_step = size; 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; } string IntToString(int number) { ostringstream TextString; TextString << number; return TextString.str(); }
Более подробную инструкцию вы можете получить посмотрев видео «Электронные часы SFML C++».
ссылка на оригинал статьи https://habr.com/ru/post/704956/
Добавить комментарий