Вот мое тестовое задание. С ООП сложновато, но сейчас читаю книгу, опыт в С есть только с микроконтроллерами, поэтому не судите строго за косяковые вопросы. Как я понял из задания необходимо написать 2 класса, 1й будет содержать инфу о виджетах, второй будет выполнять функцию их хранилища, что то типа выделенной области в HGE в которой я буду рисовать свои виджеты. Заметил, что нет простого примера в HGE на тему как например вывести на экран кнопку или полосу прокрутки из базового класса гуй, или просто строку текста. Подскажите с чего начать, какая структура должна быть у программы, может быть пример простейшего класса, чтобы задать направление моей деятельности. Заранее благодарен!
Задание: разработать собственную систему виджетов (контролов)
Необходимо:
3) Разработать классы Widget и WidgetContainer (см. приложение с примерным интерфейсом)
4) Реализовать добавление/удаление виджетов с учетом order для WidgetContainer. Порядок отрисовки виджет определяется их order. Виджеты с одинаковым order отрисываются в порядке добавления.
5) Реализовать регистрацию функций обратного вызова для событий произошедших в виджете : нажатия/ отпускания кнопок мыши, попадания/выхода мыши в/из виджета
6) Реализовать корректное удаление всех созданный объектов в программе
7) Использовать stl (контейнеры и алгоритмы) и boost (shared_ptr)
8) Весь код выдержать в едином стиле (единая конвенция именования переменных, отступы, комментарии и пр.)
Поведение разработанной программы:
1) Программа должна иметь реализацию двух виджетов - Button/Кнопка/(спрайт для нажатого и спрайт для отжатого состояния) и Image/Картинка/(один спрайт)
2) На экран выводится WidgetContainer содержащий Button (id: ”btn1”) и два Image (id: ”img1” “img2”) один из которых скрыт.
3) При наведении мышки на видимый Image вызывается функция обратного вызова, которая показывает Image, который был до этого скрыт. Примерный код этой функции:
void OnMouseEnter(Widget * widget)
{
widget->GetWidgetContainer()->GetWidget(“img2”)->Show();
}
4) При клике на Button вызывает функцию обратного выхова, которая показывает еще один WidgetContainer который содержит Button и Image. Повторный клик – скрывает.
примерный код этой функции:
void OnMouseClick(Widget * widget)
{
Widget * container = widget->GetWidgetContainer()->GetWidgetContainer()->GetWidget(“container2”);
container->Show(container->IsVisible());
}
5) Поддержка клавиатуры не требуется
Приложение: примерный интерфейс widget’а.
void SetId(const std::string & id); // установить строковый идентификатор
void SetOrder(int order); // для изменения порядка отрисовки виджетов на экране (аппаратный z-order не используется)
void SetPos(float x, float y); // положение виджета
void SetSize(float w, float h); // размер виджета. Предполагается что все виджеты – прямоугольники
void OnPressLMouseButton(void); // нажатие левой кнопки мыши
void OnReleaseLMouseButton(void); // отпускание левой кнопки мыши
void OnEnterLMouseButton(void); // попадание мыши в виджет
void OnLeaveLMouseButton(void); // выход мыши за пределы виджета
bool Update(float dt); // обновление состояни виджета
void Render(void); // отрисовка виджета
void Show(); // показать виджет
void Hide(); // скрыть виджет
void AddEventHandler(); // регистрация фунций обратного вызова для различных союбытий виджета. Параметры требуется продумать самостоятельно
|