Comments 21
У вас много дублированного кода. Вместо создания и копирования методов отличающихся лишь аргументами. Сделайте один метод и пусть он принимает 4-5 параметра. Это методы SFMLWorldTime.
Плюсом будет сделать клас тайм инкапсулирующий функционал time.h и уже данный класс передавать как зависимость в класс SFMLWorldTime. Это разобьёт ваш монолитный класс на два. Что повысит читабельность и упростит отделение рисования времени от вычисления времени.
Привыкайте сразу писать по возможности понятный и читаемый код.
Обязательно продолжайте.
Метод SFMLWorldTime::drawTime тяжело читается. Лучше вынести рисование в отдельный метод с установкой цвета, положения и т. д drawTime(int sec, int minutes, int hours) А в самом drawTime 'е вызывать метод drawDigit(int x, int y, color)
Ещё смущает частое дерганье clock_text.setString и window.draw(clock_text).
В идеале нужно сначала сформировать строку часов минут секунд и потом уже одним вызовом отрисовать.
И делать window.draw(clock_text) один раз в конце цикла событий.
Ещё замечу. Залейте примеры на гитхаб и добавьте в проект cmake. Тогда сборка ваших примеров будет элементарна. Клонируем репозиторий и жмём в студии собрать. Красота и минимум телодвижений.
Недостаток статьи - используемый стандарт языка на уровне С++03. Многое было бы проще с использованием современного С++.
На вскидку - std::chrono, to_string() вместо ostingstream и т.д.
Ещё замечание, никогда не пишите это в заголовочных файлах:
using namespace sf;
using namespace std;
это считается очень дурным стилем.
Спасибо код уже обновил
А внутри методов-функций можно? ?
Можно код разместить вне класса внутри функций
В примере using размещено в самом начале файла, а не в методах.
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rs-using-directive
Да и, опять же, сложные методы, требующие using в теле, я бы тоже перенёс в cpp/cxx файл, а для коротких - четыре-пять лишних символов не большая помеха. И в целом, хорошим тоном, даже для методов, считается вкладывать не всё пространство имён, а только нужную часть.
Только сейчас посмотрел видео. Не лучше ли озвучить ролик своим голосом, а не этим роботизированным?
Я бы убрал из класса SFMLWorldTime "struct tm newtime" и перенес работу с датой в класс который бы возвращал время в секундах, минутах и часах. SFMLWorldTime переименовал в SFMLTimePainter. SFMLWorldTime может возвращать время по Now
Вот пример.
https://github.com/JordanCpp/Lt/blob/master/src/Lt/Core/DateTime.cpp
Оборачиваете struct tm в DateTime
Это все на ваше усмотрение. Я понимаю, что это всего лишь пример. Может и не стоит настолько мелко разбивать задачу.
Оборачиваете struct tm в DateTime
Но зачем если есть std::chrono?
Потребуется С++20 или внешняя библиотека для предыдущих стандартов
#include <chrono>
int
main()
{
using namespace std::chrono;
// Get a local time_point with system_clock::duration precision
auto now = zoned_time{current_zone(), system_clock::now()}.get_local_time();
// Get a local time_point with days precision
auto ld = floor<days>(now);
// Convert local days-precision time_point to a local {y, m, d} calendar
year_month_day ymd{ld};
// Split time since local midnight into {h, m, s, subseconds}
hh_mm_ss hms{now - ld};
// This part not recommended. Stay within the chrono type system.
int year{ymd.year()};
int month = unsigned{ymd.month()};
int day = unsigned{ymd.day()};
int hour = hms.hours().count();
int minute = hms.minutes().count();
int second = hms.seconds().count();
}
https://stackoverflow.com/questions/61190884/current-time-and-date-in-c20-days
библиотека для С++11/14/17
Попробую С++20
#include <chrono>
#include <iostream>
#include <thread>
int main() {
using namespace std::chrono;
while (true)
{ // получаем локальное время
auto now = zoned_time{ current_zone(), system_clock::now() }.get_local_time();
// получаем точность локального времени день
auto ld = floor<days>(now);
// получаем точность суточное время
hh_mm_ss hms{ now - ld };
// форматированный вывод времени в консоль часы, минуты, секунды
std::cout << "\n\n\n\t\t\t" << hms.hours().count() << ":" << hms.minutes().count() << ":" << hms.seconds().count();
// задержка 500 милисекунд
std::this_thread::sleep_for(500ms);
// очистка экрана
system("cls");
}
}
Найду время и подрефакторю код. Выложу на гитхаб. Типа как бы я сделал:)
Электронные часы, мультимедийная библиотека SFML для разработки игр на C++