> Свободная база знаний SFML > Уроки SFML > Разработка 2D Игр > Уроки от legozaur > Приложение 1. Основные классы > MWindows (окна)
Название: Windows – окна
Предназначение: управление внутри-программными окнами, обработка событий мыши на окна.
Возможности:
1. Отрисовка большого количества окон
2. Правильная отрисовка окон
3. Перетаскивание окон
4*. Управление окном (размеры, кнопки, и т.д.)
Исходный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include "stdafx.h" #include "Window.h" #include "Mouse.h" #ifndef DSL_WINDOWS_H #define DSL_WINDOWS_H class Windows { protected: bool flag1; // true - если нажатие мыши было на любом окне bool flag2; // true - если если нажатие было на области перемещения int mouseClickX; int mouseClickY; int windowClickX; int windowClickY; std::vector<Window*> vecWindows; public: Windows(void); ~Windows(void); // Задаёт начальную информацию void data(void); // Добавлякт окно в обработчик окон void add(Window* window); // Обработчик событий (поведение окон) void behavior(Mouse* mouse); // Сортировка окон void sort1(int j); // void coutVec1(); // Отрисовка во входящем окне void draw(sf::RenderWindow* window); }; #endif DSL_WINDOWS_H |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
#include "Windows.h" Windows::Windows(void) { data(); } Windows::~Windows(void) { // Освобождаем память vecWindows.~vector(); } // Задаёт начальную информацию void Windows::data(void) { flag1 = false; flag2 = false; mouseClickX = 0; mouseClickY = 0; windowClickX = 0; windowClickY = 0; vecWindows.reserve(1); } // Добавлякт окно в обработчик окон void Windows::add(Window* window) { cout << "add(" << window << ");"<< endl; vecWindows.push_back(window); } // Обработчик событий (поведение окон) void Windows::behavior(Mouse* mouse) { int x = (*mouse).getX(); int y = (*mouse).getY(); int j = 0; switch((*mouse).getEventButton(sf::Mouse::Left)) { // ЛКМ: не нажата case 0: break; // ЛКМ: нажатие (1 раз) case 1: cout << "1"; // Проходим по всем окнам, начиная с первого по фокусу for(std::vector<Window*>::iterator it = vecWindows.begin(); it != vecWindows.end(); it++) { if(flag1 == false) { // Проверка: было ли нажатие мыши в окне if((*it)->check1(&x, &y) == true) { // Если нажатие было flag1 = true; // Запоминаем координаты мыши mouseClickX = x; mouseClickY = y; // Запоминаем координаты окна windowClickX = (*it)->getPositionX(); windowClickY = (*it)->getPositionY(); // Сортируем окна вынося на первый план то, которое было выделено sort1(j); // Проверяем кое что-то //if((*it)->check2(&x, &y)) if(vecWindows[0]->check2(&x, &y)) // Фича (02.04.2016 15:48) - без неё сначала надо 1 раз кликнуть по нужному окну, а потом перетаскивать его { // Если клик мыши был по перетаскиваемой зоне flag2 = true; } } } j++; } // Точка, где будет программа после нахождения или не нахождения окна break; // ЛКМ: нажата case 2: cout << "2"; // Если была кликнута зона перетаскивания if(flag2 == true) { // Расчитываем изменение координат с момента клика int dx = x - mouseClickX; int dy = y - mouseClickY; cout << dx << ":" << dy << endl; // Ставим окно в координаты vecWindows[0]->setPosition(windowClickX + dx, windowClickY + dy); } break; // ЛКМ: отжатие (1 раз) case 3: flag1 = false; flag2 = false; j = 0; break; } } // Сортировка окон void Windows::sort1(int j) { Window* window = vecWindows[j]; for(int i=j; i>0; i--) { vecWindows[i] = vecWindows[i-1]; } vecWindows[0] = window; } void Windows::coutVec1() { for(std::vector<Window*>::iterator it = vecWindows.begin(); it != vecWindows.end(); it++) cout << (*it) << " "; cout << endl; } // Отрисовка во входящем окне void Windows::draw(sf::RenderWindow* window) { //for(std::vector<Window*>::iterator it = vecWindows.end()-1; it+1 != vecWindows.begin(); it--) // (*it)->draw(window); int imax = vecWindows.size()-1; for(int i=imax; i>=0; i--) vecWindows[i]->draw(window); } |