Архивы: Справочники
– пусто –
– пусто –
sf::Sprite (Спрайт) [пусто]
ВАЖНО!
При загрузке нового изображения в текстуру, а потом в спрайт не забывайте использовать
1 |
sprite.setTextureRect(sf::IntRect(newX1, newY1, newX2 newY2)); |
Иначе будут использоваться размеры старой картинки или текстуры.
Я на поиск данной фишки потратил пару часов.
sf::Texture (текстура) [пусто]
– пусто –
Design (Дизайн)
Название: Design – дизайн
Предоставляет графические примитивы для создания дизайна окон/курсора/кнопок
Хронология:
05.04.2016 – v1.0
23.12.2016 – v2.0
– классы Design, DesignWindow, DesignCursor объединены в Design
– добавлена структура DesignButton (для winButton из Window)
Window (окно)
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); } |
Алгоритм сражения 1
Данных алгоритм ещё не проверялся, но я думаю он идеально описывает алгоритмы боя из других игр
1. Общая функция
1 2 3 4 5 6 7 8 |
void function0(float time) { switch(current_status) { case 1: function1(time); break; // current_status == 1 - время между ударами case 2: function2(time); break; // current_status == 2 - время удара } } |
2. Время между ударами
1 2 3 4 5 6 7 8 9 10 |
void function1(float time) { if(time1 <= 0) {//Если время между ударами кончилось time2 = time2max + time1; // поправка на остаточное время current_status = 2; // изменяем статус } else { time1 -= time; } } |
3. Замах(время удара) и удар
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void function2(float time) { if(isAttack == true) { // Если можно атаковать if(time2 <= 0) {// если время удара кончилось attack(); // выполняем атаку time1 = time1max + time2; // поправка на остаточное время current_status = 1; // изменяем статус } else { time2 -= time; } } } |
4. Отмена атаки
1 2 3 4 |
void cancelAttack() { time2 = time2max; // атака была отменена, замах должен быть произведён заного } |