Краткое описание:
Мой класс Mouse (на базе sf::Mouse), который может отслеживать координаты мыши а так-же 4 состояния клавиш мыши.
Он нужен для того чтобы перехватывать моменты нажатия и отжатия клавиш мыши (SFML нам такие функции не предоставила)
Перехватить эти события можно функцией
1 |
int getEventButton(sf::Mouse::Button button); |
Она анализирует конкретную клавишу мыши, и возвращает число int от 0 до 3, которые означают
0 – клавиша не нажата
1 – нажатие клавиши (pressed)
2 – клавиша нажата
3 – отжатие клавиши (released)
Очень полезный класс для перехвата событий мыши.
Пример: если произошло нажатие ЛКМ, вывести сообщение
1 2 3 4 5 |
//int getEventButton(sf::Mouse::Button button); if(mouse->getEventButton(sf::Button::Left) == 1) { cout << "Mouse: left pressed" << endl; } |
Исходный код:
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 |
//Mouse.h #include "stdafx.h" // Created by Kildushov Oleg // Создатель - Кильдюшов Олег // vk.com/legozaur // kychka-pc.ru - nikname: legozaur // 10:06 16.12.2015 #ifndef DSL_MOUSE_H #define DSL_MOUSE_H struct MouseKey { bool isKeyPressed; }; class Mouse { private: int posX; int posY; bool mass[5]; void data(); sf::RenderWindow* window; // Ссылка на окно public: Mouse(); ~Mouse(); bool setWindow(sf::RenderWindow *RenderWindow); void behavior(); int getX(); int getY(); // Данная функция возвращает событие, // которое произошло с принимаемой клавишей, // в текущий момент времени // 0 - нет событий (многократно) // 1 - нажатие клавиши (единожды) // 2 - удерживание клавиши (многократно) // 3 - отпускание клавишы (единожды) int getEventButton(sf::Mouse::Button button); }; #endif DSL_MOUSE_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 |
//Mouse.cpp #include "Mouse.h" // Created by Kildushov Oleg // Создатель - Кильдюшов Олег // vk.com/legozaur // kychka-pc.ru - nikname: legozaur // 10:07 16.12.2015 Mouse::Mouse() { data(); } Mouse::~Mouse(){} void Mouse::data() { posX = 0; posY = 0; for(int i = 0; i<5; i++) mass[i] = false; } bool Mouse::setWindow(sf::RenderWindow *RenderWindow) { try { window = RenderWindow; } catch(...) { cout << "Error Mouse::setWindow"; return false; } return true; } void Mouse::behavior() { sf::Vector2i pixelPos = sf::Mouse::getPosition(*window); sf::Vector2f pos = (*window).mapPixelToCoords(pixelPos); posX = pos.x; posY = pos.y; } int Mouse::getX() { return posX; } int Mouse::getY() { return posY; } int Mouse::getEventButton(sf::Mouse::Button button) { bool isPressed = sf::Mouse::isButtonPressed(button); // Нажата ли принимаемая клавиша? bool isPressed2 = mass[button]; // Была ли до этого нажата данная клавиша? if(isPressed2 != isPressed) { // Если состояние клавишь различны if(isPressed2 == true) { // Кнопка была нажата, теперь не нажата mass[button] = false; return 3; // 3 если была отпущена } else { // Кнопка была не нажата, теперь нажата mass[button] = true; return 1; // 1 если была нажата } } else { // Состояние не менялось if(isPressed2 == true) // Если кнопка была нажата return 2; // 2 если кнопка зажата else return 0; // 0 если кнопка не нажата } } |
Функция main для регистрации событий ЛКМ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include "stdafx.h" #include "Mouse.h" int main() { Mouse* m = new Mouse(); for(int i = 0; igetEventButton(sf::Mouse::Left)) { case 0: cout << "."; break; case 1: cout << "["; break; case 2: cout << "_"; break; case 3: cout << "]"; break; getEventButton(sf::Mouse::Middle) == 1) break; // выход из цикла } return 0; } |
Функция main для регистрации координат курсора
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include "stdafx.h" #include "Mouse.h" using namespace std; int main() { sf::RenderWindow window(sf::VideoMode(1200, 700), "kychka-pc.ru/legozaur"); Mouse* m = new Mouse(); m->setWindow(&window); // Привязываем мышь к окну while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } m->behavior(); // обязательно, если не хотите получить x и y равные 0 cout <getX() << ":" <getY() << endl; } delete(m); return 0; } |
Думаю, тут и так всё понятно.