Электронные часы, мультимедийная библиотека SFML для разработки игр на C++

от автора

Предыдущая тема

Вариантов отобразить электронные часы на языке программирования С++ очень множество, в данной статье рассмотрим электронные часы для 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; }
Выполнение кода шаблона SFML C++
Выполнение кода шаблона SFML C++

Если Вы с первой часть справились успешно, тогда можем добавить к нашему проекту новый класс назовём его 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/