diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 3f0903d31..fcff403c6 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -31,9 +31,11 @@ if(SFML_BUILD_GRAPHICS) if(SFML_OS_WINDOWS) add_subdirectory(win32) + add_subdirectory(raw_input) elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD) if(NOT SFML_USE_DRM) add_subdirectory(X11) + add_subdirectory(raw_input) endif() elseif(SFML_OS_MACOS) add_subdirectory(cocoa) diff --git a/examples/raw_input/CMakeLists.txt b/examples/raw_input/CMakeLists.txt new file mode 100644 index 000000000..ba2723948 --- /dev/null +++ b/examples/raw_input/CMakeLists.txt @@ -0,0 +1,7 @@ +# all source files +set(SRC RawInput.cpp) + +# define the raw_input target +sfml_add_example(raw_input GUI_APP + SOURCES ${SRC} + DEPENDS SFML::Graphics) diff --git a/examples/raw_input/RawInput.cpp b/examples/raw_input/RawInput.cpp new file mode 100644 index 000000000..d514864a6 --- /dev/null +++ b/examples/raw_input/RawInput.cpp @@ -0,0 +1,72 @@ +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + +#include + + +//////////////////////////////////////////////////////////// +/// Entry point of application +/// +/// \return Application exit code +/// +//////////////////////////////////////////////////////////// +int main() +{ + // Create the main window + sf::RenderWindow window(sf::VideoMode({800u, 600u}), "SFML Raw Mouse Input", sf::Style::Titlebar | sf::Style::Close); + window.setVerticalSyncEnabled(true); + + // Load the application font and pass it to the Effect class + const auto font = sf::Font::loadFromFile("resources/tuffy.ttf").value(); + + // Create the mouse position text + sf::Text mousePosition(font, "", 20); + mousePosition.setPosition({400.f, 300.f}); + mousePosition.setFillColor(sf::Color::White); + + // Create the mouse raw movement text + sf::Text mouseRawMovement(font, "", 20); + mouseRawMovement.setFillColor(sf::Color::White); + + std::vector log; + + while (window.isOpen()) + { + while (const auto event = window.pollEvent()) + { + if (event.is()) + { + window.close(); + break; + } + + static const auto vec2ToString = [](const sf::Vector2i& vec2) + { return '(' + std::to_string(vec2.x) + ", " + std::to_string(vec2.y) + ')'; }; + + if (const auto* const mouseMoved = event.getIf()) + mousePosition.setString("Mouse Position: " + vec2ToString(mouseMoved->position)); + + if (const auto* const mouseMovedRaw = event.getIf()) + { + log.emplace_back("Mouse Movement: " + vec2ToString(mouseMovedRaw->delta)); + + if (log.size() > 24u) + log.erase(log.begin()); + } + } + + window.clear(); + window.draw(mousePosition); + + for (std::size_t i = 0; i < log.size(); ++i) + { + mouseRawMovement.setPosition({50.f, static_cast(i * 20) + 50.f}); + mouseRawMovement.setString(log[i]); + window.draw(mouseRawMovement); + } + + window.display(); + } +} diff --git a/examples/raw_input/resources/tuffy.ttf b/examples/raw_input/resources/tuffy.ttf new file mode 100644 index 000000000..8ea647090 Binary files /dev/null and b/examples/raw_input/resources/tuffy.ttf differ