Как сделать электронные часы для 2D игр, использу библиотеку SFML на С++. Указываем координаты, шрифт, цвет и размер часов на экране игрока.
4К открытий4К показов
Вариантов отобразить электронные часы на языке программирования С++ очень множество, в данной статье рассмотрим электронные часы для 2D игр, используя мультимедийную библиотеку SFML. Для удобства дальнейшего внедрения данного кода в наши проекты создадим класс электронные часы, в котором реализуем возможность устанавливать: координаты, шрифт, размер и цвет электронных часов.
#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 — сохраняет код ошибки при неверном подключении времени.
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.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
В методе 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);
};
Не так давно вышла новая версия GNU Compiler Collection — GCC 14.1. Обновление принесло немало новшеств, призванных улучшить компилятор и исправить ошибки
Вот самые интересные новые функции для языка C++, появившиеся в этой версии компилятора.