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

Электронные часы, мультимедийная библиотека 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

#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++».