Почти в каждой современной игре есть окна и кнопки для элементарного взаимодействия с игроком.
Вот пример одной MMORPG c оконной системой
Скажем так, SFML не предоставляет такого функционала, поэтому его придётся делать вручную. В нескольких уроках мы рассмотрим как создавать такую систему практически с 0. Мы будем имитировать работу оконной системы Windows.
1. EventHandlerWindows
2. Window
3. Design
4. Item
В этом уроке рассмотрим всё поверхностно, а в следующем углубимся.
1. EventHandlerWindows – обработчик событий окон.
Это класс, который содержит в себе ссылки на окна и некоторые данные для обработки, а так-же ориентируясь на мышь управляет окнами.
Основные функции нужные в обработчике:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Добавлякт окно в обработчик окон void add(Window* window); // Обработчик событий (поведение окон) void behavior(int numEvent); // Сортировка окон void sort1(int j); // Установить видимость окна под номером num в положение flag bool setVisibleWin(int num, bool flag); // Заменить на противоположное значение видимости окна void switchVisibleWin(int num); // Отрисовка во входящем окне void draw(sf::RenderWindow* window); void draw(); |
Из комментариев и так понятно для чего нужны эти функции.
Стоит выделить самые важные из них:
1. add(Window* win) – добавляет окно в обработчик окон
2. behavior(int numEvent) – управляет окнами опираясь на входящие события мыши (numEvent)
3. draw() – отображение окон
В цикле обработки игры это будет выглядеть вот так:
1 2 3 4 5 6 7 8 9 10 |
mouse->behavior(); int num = mouse->getEventButton(sf::Mouse::Left); EHW->behavior(num); window.clear(sf::Color::White); EHW->draw(); mouse->draw(); window.display(); |
2. Window – окно
Класс Window представляет собой набор параметров (например координаты и размеры окна) и объекты (спрайты, кнопки, картинки и т.д.), а так-же набор функций для добавления этих объектов, их обработки и отображения.
Наше окно может перемещаться, закрываться и даже изменять размеры! В файле Window.h описаны доп. структуры которые и образуют окно.
1 2 3 4 5 6 7 |
struct winSprite; struct WinItem; struct winMcText; struct winButton; struct winSave; struct winSlot; struct winCheckBox; |
Немного поподробнее:
winSprite – это спрайт, из которого создаётся сама рамка окна
winItem – это базовый класс для последующих элементов, которые будут расположены на нашем окне (winButton, winSlot, winCheckBox, winMcText)
winMcText – тот же mcText только привязанный к окну.
winSave – набор параметров, которые нужны для изменения размеров окна.
Основные функции нужные в окне:
1 2 3 4 5 6 7 |
void setDesign(DesignWindow* desWin); void save(vec2i, int); void changeSize(Mouse*); void changePosition(Mouse*); void setPosition(int x, int y); void draw(sf::RenderWindow*); void addItem(int type, sf::String filename, vec2f vec); |
setDesign(DesignWindow* desWin) – меняет все winSprite основываясь на входящем дизайне. Об этом позже.
save(vec2i, int) – сохраняет информацию из обработчика окон в winSave
changeSize(Mouse*) – изменение размеров окна
changePosition(Mouse*) – изменение положения окна
setPosition(int x, int y) – установка координат окна и компонентов
addItem(int type, sf::String filename, vec2f vec) – добавление элемента в окно (кнопок, слотов, чекБоксов, картинок)
3. Design – дизайн
Этот класс служит для того чтобы создавать картинки для дизайнов окон, курсора, кнопок и т.д.
Вот такая картинка используется для создания окон в стиле аля Windows 8
4. Item – итем
Содержит в себе SFML image, texture, sprite и информацию (позиция и размер). Используется в структуре winItem.
В сумме результат работы всех этих классов выглядит вот так:
Подробный разбор классов будет во второй части.