From 9f143d8496812eeab5cc8457c69f90a2b7864ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= Date: Fri, 14 Feb 2025 12:43:33 +0100 Subject: [PATCH 1/3] Update CI build script - Update checkout action to v4 - Add missing SFML dependency on Linux - Add new drawables - Update macOS image --- .github/workflows/ci.yml | 11 ++++++----- CMakeLists.txt | 8 +++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cabc222..f057b0c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: - { name: Windows Clang, os: windows-2022, flags: -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ } - { name: Linux GCC, os: ubuntu-22.04, flags: -GNinja } - { name: Linux Clang, os: ubuntu-22.04, flags: -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ } - - { name: macOS, os: macos-12, flags: -GNinja } + - { name: macOS, os: macos-14, flags: -GNinja } type: - { name: Release } - { name: Debug } @@ -39,14 +39,14 @@ jobs: if: runner.os == 'Linux' run: | sudo apt update - sudo apt install ninja-build llvm xorg-dev libxrandr-dev libxcursor-dev libudev-dev libgl1-mesa-dev libegl1-mesa-dev + sudo apt install ninja-build llvm xorg-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libgl1-mesa-dev libegl1-mesa-dev - name: Install macOS Tools if: runner.os == 'macOS' run: brew install ninja - name: Checkout SFML - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: SFML/SFML path: sfml @@ -55,7 +55,8 @@ jobs: - name: Configure SFML run: | cmake -S sfml -B sfml/build \ - -DCMAKE_INSTALL_PREFIX=sfml/install \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/sfml/install \ -DCMAKE_BUILD_TYPE=${{matrix.type.name}} \ -DSFML_BUILD_AUDIO=OFF \ -DSFML_BUILD_NETWORK=OFF \ @@ -65,7 +66,7 @@ jobs: run: cmake --build sfml/build --config ${{matrix.type.name}} --target install - name: Checkout SelbaWard - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: SelbaWard diff --git a/CMakeLists.txt b/CMakeLists.txt index 67adf98..3e3fb3e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.16) project(SelbaWard LANGUAGES CXX) -find_package(SFML 2.6 REQUIRED COMPONENTS graphics) +find_package(SFML 3 REQUIRED COMPONENTS Graphics) add_library(SelbaWard src/SelbaWard/BitmapFont.cpp @@ -9,6 +9,7 @@ add_library(SelbaWard src/SelbaWard/ConsoleScreen.cpp src/SelbaWard/Crosshair.cpp src/SelbaWard/ElasticSprite.cpp + src/SelbaWard/FrameTransition.cpp src/SelbaWard/GallerySprite.cpp src/SelbaWard/Line.cpp src/SelbaWard/NinePatch.cpp @@ -20,13 +21,14 @@ add_library(SelbaWard src/SelbaWard/SpinningCard.cpp src/SelbaWard/Spline.cpp src/SelbaWard/Sprite3d.cpp + src/SelbaWard/SpriteBatch.cpp src/SelbaWard/Starfield.cpp src/SelbaWard/Starfield3d.cpp ) add_library(SelbaWard::SelbaWard ALIAS SelbaWard) target_include_directories(SelbaWard PUBLIC src) -target_link_libraries(SelbaWard PUBLIC sfml-graphics) -target_compile_features(SelbaWard PUBLIC cxx_std_11) +target_link_libraries(SelbaWard PUBLIC SFML::Graphics) +target_compile_features(SelbaWard PUBLIC cxx_std_17) # Stop configuration if being consumed by a higher level project if(NOT PROJECT_IS_TOP_LEVEL) From 2994e93b3626a7d9cba8af4c94c316fbfa33c028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= Date: Fri, 14 Feb 2025 13:18:26 +0100 Subject: [PATCH 2/3] Update remaining drawables to SFML 3 --- src/SelbaWard/FrameTransition.cpp | 72 ++++++++++++++----------------- src/SelbaWard/NinePatch.cpp | 2 +- src/SelbaWard/Starfield3d.cpp | 34 +++++++-------- 3 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/SelbaWard/FrameTransition.cpp b/src/SelbaWard/FrameTransition.cpp index 859b6aa..734a9ae 100644 --- a/src/SelbaWard/FrameTransition.cpp +++ b/src/SelbaWard/FrameTransition.cpp @@ -33,6 +33,7 @@ #include "FrameTransition.hpp" #include // for lround +#include // for uint8_t namespace { @@ -43,7 +44,7 @@ inline float linearInterpolation(const float a, const float b, const float alpha } inline sf::Color colorFromColorAndAlpha(sf::Color color, const unsigned int alpha) { - color.a = static_cast(alpha); + color.a = static_cast(alpha); return color; } @@ -149,8 +150,7 @@ void FrameTransition::setTexture(const FrameId frameId, const sf::Texture& textu frame.pTexture = &texture; if (resetRect) { - frame.textureRect.width = frame.pTexture->getSize().x; - frame.textureRect.height = frame.pTexture->getSize().y; + frame.textureRect.size = sf::Vector2i(frame.pTexture->getSize()); } } void FrameTransition::setTexture(const FrameId frameId) @@ -383,7 +383,7 @@ void FrameTransition::priv_updateFromTexCrop() const if (swapDirection) { - // since front and back are currenty equal to start and end, flip them if we are facing in opposite direction + // since front and back are currently equal to start and end, flip them if we are facing in opposite direction if (texCropA == TexCrop::Front) texCropA = TexCrop::Back; else if (texCropA == TexCrop::Back) @@ -404,13 +404,13 @@ void FrameTransition::priv_updateFromTexCrop() const { case Direction::Left: case Direction::Right: - scaleSizeA = texRectA.width; - scaleSizeB = texRectB.width; + scaleSizeA = texRectA.size.x; + scaleSizeB = texRectB.size.x; break; case Direction::Up: case Direction::Down: - scaleSizeA = texRectA.height; - scaleSizeB = texRectB.height; + scaleSizeA = texRectA.size.y; + scaleSizeB = texRectB.size.y; break; } @@ -465,17 +465,17 @@ void FrameTransition::priv_updateFromTexCrop() const { case Direction::Left: case Direction::Right: - texRectA.left = offsetPosA; - texRectA.width = scaleSizeA; - texRectB.left = offsetPosB; - texRectB.width = scaleSizeB; + texRectA.position.x = offsetPosA; + texRectA.size.x = scaleSizeA; + texRectB.position.x = offsetPosB; + texRectB.size.x = scaleSizeB; break; case Direction::Down: case Direction::Up: - texRectA.top = offsetPosA; - texRectA.height = scaleSizeA; - texRectB.top = offsetPosB; - texRectB.height = scaleSizeB; + texRectA.position.y = offsetPosA; + texRectA.size.y = scaleSizeA; + texRectB.position.y = offsetPosB; + texRectB.size.y = scaleSizeB; break; } @@ -654,8 +654,8 @@ void FrameTransition::priv_updateFromZoom() const sf::Vector2f quadSizeA{ m_size }; sf::Vector2f quadSizeB{ m_size }; - sf::Vector2f texSizeA{ texRectA.getSize() }; - sf::Vector2f texSizeB{ texRectB.getSize() }; + sf::Vector2f texSizeA{ texRectA.size }; + sf::Vector2f texSizeB{ texRectB.size }; switch (zoomTypeA) { case ZoomType::Scale: @@ -678,35 +678,27 @@ void FrameTransition::priv_updateFromZoom() const // top lefts calculated to place the resized rectangles in the centre of their originals - sf::Vector2f texTopLeftA{ (texRectA.getSize() - texSizeA) * 0.5f }; - sf::Vector2f texTopLeftB{ (texRectB.getSize() - texSizeB) * 0.5f }; + sf::Vector2f texTopLeftA{ (texRectA.size - texSizeA) * 0.5f }; + sf::Vector2f texTopLeftB{ (texRectB.size - texSizeB) * 0.5f }; sf::Vector2f posTopLeftA{ (m_size - quadSizeA) * 0.5f }; sf::Vector2f posTopLeftB{ (m_size - quadSizeB) * 0.5f }; // resized texture rectangles - texRectA.left = texTopLeftA.x; - texRectA.top = texTopLeftA.y; - texRectA.width = texSizeA.x; - texRectA.height = texSizeA.y; + texRectA.position = texTopLeftA; + texRectA.size = texSizeA; - texRectB.left = texTopLeftB.x; - texRectB.top = texTopLeftB.y; - texRectB.width = texSizeB.x; - texRectB.height = texSizeB.y; + texRectB.position = texTopLeftB; + texRectB.size = texSizeB; // resized quad rectangles sf::FloatRect posRectA{}; sf::FloatRect posRectB{}; - posRectA.left = posTopLeftA.x; - posRectA.top = posTopLeftA.y; - posRectA.width = quadSizeA.x; - posRectA.height = quadSizeA.y; + posRectA.position = posTopLeftA; + posRectA.size = quadSizeA; - posRectB.left = posTopLeftB.x; - posRectB.top = posTopLeftB.y; - posRectB.width = quadSizeB.x; - posRectB.height = quadSizeB.y; + posRectB.position = posTopLeftB; + posRectB.size = quadSizeB; @@ -737,8 +729,8 @@ void FrameTransition::priv_addQuad(const std::size_t startVertex, const Quad& qu } void FrameTransition::priv_setQuadPositionsFromRect(Quad& quad, sf::FloatRect rect) const { - const sf::Vector2f topLeft(rect.getPosition()); - const sf::Vector2f bottomRight{ sf::Vector2f(rect.getSize()) + topLeft }; + const sf::Vector2f topLeft(rect.position); + const sf::Vector2f bottomRight{ sf::Vector2f(rect.size) + topLeft }; quad.topLeft.position = topLeft; quad.bottomRight.position = bottomRight; quad.bottomLeft.position = { topLeft.x, bottomRight.y }; @@ -746,8 +738,8 @@ void FrameTransition::priv_setQuadPositionsFromRect(Quad& quad, sf::FloatRect re } void FrameTransition::priv_setQuadTextureCoordsFromRect(Quad& quad, sf::FloatRect rect) const { - const sf::Vector2f topLeft(rect.getPosition()); - const sf::Vector2f bottomRight{ sf::Vector2f(rect.getSize()) + topLeft }; + const sf::Vector2f topLeft(rect.position); + const sf::Vector2f bottomRight{ sf::Vector2f(rect.size) + topLeft }; quad.topLeft.texCoords = topLeft; quad.bottomRight.texCoords = bottomRight; quad.bottomLeft.texCoords = { topLeft.x, bottomRight.y }; diff --git a/src/SelbaWard/NinePatch.cpp b/src/SelbaWard/NinePatch.cpp index f33ac24..533f61d 100644 --- a/src/SelbaWard/NinePatch.cpp +++ b/src/SelbaWard/NinePatch.cpp @@ -147,7 +147,7 @@ namespace selbaward NinePatch::NinePatch() : m_primitiveType{ sf::PrimitiveType::TriangleStrip } - , m_vertices(22u, sf::Vertex({ 0.f, 0.f })) + , m_vertices(22u, sf::Vertex{{ 0.f, 0.f }}) , m_texture{ nullptr } , m_trimmedSize({ 0.f, 0.f }) , m_size({ 0.f, 0.f }) diff --git a/src/SelbaWard/Starfield3d.cpp b/src/SelbaWard/Starfield3d.cpp index 7e43b12..4500897 100644 --- a/src/SelbaWard/Starfield3d.cpp +++ b/src/SelbaWard/Starfield3d.cpp @@ -118,13 +118,13 @@ void Starfield3d::move(const sf::Vector3f movement) position = priv_generateRandomStarPosition(EdgeLock::Front); // wrap 2D (xy slice) - if (position.x < m_deepestSliceBounds.left) + if (position.x < m_deepestSliceBounds.position.x) position = priv_generateRandomStarPosition(EdgeLock::Right); - else if (position.x > (m_deepestSliceBounds.left + m_deepestSliceBounds.width)) + else if (position.x > (m_deepestSliceBounds.position.x + m_deepestSliceBounds.size.x)) position = priv_generateRandomStarPosition(EdgeLock::Left); - if (position.y < m_deepestSliceBounds.top) + if (position.y < m_deepestSliceBounds.position.y) position = priv_generateRandomStarPosition(EdgeLock::Bottom); - else if (position.y > (m_deepestSliceBounds.top + m_deepestSliceBounds.height)) + else if (position.y > (m_deepestSliceBounds.position.y + m_deepestSliceBounds.size.y)) position = priv_generateRandomStarPosition(EdgeLock::Top); } @@ -140,13 +140,13 @@ void Starfield3d::pan(const sf::Vector2f panAmount) position -= movement * (((1.f + position.z) * m_depthCalibration - 1.f)); // wrap 2D (xy slice) - if (position.x < m_deepestSliceBounds.left) + if (position.x < m_deepestSliceBounds.position.x) position = priv_generateRandomStarPosition(EdgeLock::Right); - else if (position.x > (m_deepestSliceBounds.left + m_deepestSliceBounds.width)) + else if (position.x > (m_deepestSliceBounds.position.x + m_deepestSliceBounds.size.x)) position = priv_generateRandomStarPosition(EdgeLock::Left); - if (position.y < m_deepestSliceBounds.top) + if (position.y < m_deepestSliceBounds.position.y) position = priv_generateRandomStarPosition(EdgeLock::Bottom); - else if (position.y > (m_deepestSliceBounds.top + m_deepestSliceBounds.height)) + else if (position.y > (m_deepestSliceBounds.position.y + m_deepestSliceBounds.size.y)) position = priv_generateRandomStarPosition(EdgeLock::Top); } @@ -269,7 +269,7 @@ void Starfield3d::priv_updateVertices() const sf::Vector2f starPosition{ priv_projectPoint(m_positions[starIndex]) }; for (std::size_t vertex{ 0u }; vertex < numberOfVerticesPerStar; ++vertex) { - m_vertices[star * numberOfVerticesPerStar + vertex] = starPosition + (sf::Vector2f{ m_starTemplate[vertex].position.x, m_starTemplate[vertex].position.y } * depthScale); + m_vertices[star * numberOfVerticesPerStar + vertex].position = starPosition + (sf::Vector2f{ m_starTemplate[vertex].position.x, m_starTemplate[vertex].position.y } * depthScale); m_vertices[star * numberOfVerticesPerStar + vertex].color = m_starTemplate[vertex].color * color; } } @@ -296,8 +296,8 @@ sf::Vector3f Starfield3d::priv_generateRandomStarPosition() const { sf::Vector3f position; position.z = randomValue(0.f, m_maxDepth); - position.x = randomValue(m_deepestSliceBounds.left, m_deepestSliceBounds.left + m_deepestSliceBounds.width); - position.y = randomValue(m_deepestSliceBounds.top, m_deepestSliceBounds.top + m_deepestSliceBounds.height); + position.x = randomValue(m_deepestSliceBounds.position.x, m_deepestSliceBounds.position.x + m_deepestSliceBounds.size.x); + position.y = randomValue(m_deepestSliceBounds.position.y, m_deepestSliceBounds.position.y + m_deepestSliceBounds.size.y); return position; } @@ -313,18 +313,18 @@ sf::Vector3f Starfield3d::priv_generateRandomStarPosition(const EdgeLock edgeLoc position.z = randomValue(0.f, m_maxDepth); if (edgeLock == EdgeLock::Left) - position.x = m_deepestSliceBounds.left; + position.x = m_deepestSliceBounds.position.x; else if (edgeLock == EdgeLock::Right) - position.x = m_deepestSliceBounds.left + m_deepestSliceBounds.width; + position.x = m_deepestSliceBounds.position.x + m_deepestSliceBounds.size.x; else - position.x = randomValue(m_deepestSliceBounds.left, m_deepestSliceBounds.left + m_deepestSliceBounds.width); + position.x = randomValue(m_deepestSliceBounds.position.x, m_deepestSliceBounds.position.x + m_deepestSliceBounds.size.x); if (edgeLock == EdgeLock::Top) - position.y = m_deepestSliceBounds.top; + position.y = m_deepestSliceBounds.position.y; else if (edgeLock == EdgeLock::Bottom) - position.y = m_deepestSliceBounds.top + m_deepestSliceBounds.height; + position.y = m_deepestSliceBounds.position.y + m_deepestSliceBounds.size.y; else - position.y = randomValue(m_deepestSliceBounds.top, m_deepestSliceBounds.top + m_deepestSliceBounds.height); + position.y = randomValue(m_deepestSliceBounds.position.y, m_deepestSliceBounds.position.y + m_deepestSliceBounds.size.y); return position; } From ca4b4848357f45d1ce56ca021d42fd574d162dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= Date: Fri, 14 Feb 2025 13:52:13 +0100 Subject: [PATCH 3/3] Update examples to SFML 3 --- examples/bitmapTextExample.cpp | 19 +++--- examples/lineExample.cpp | 25 ++++---- examples/progressBarExample.cpp | 23 ++++--- examples/spinningCardExample.cpp | 35 +++++------ examples/splineExample.cpp | 23 ++++--- examples/splineExample2.cpp | 45 ++++++-------- examples/sprite3dExample.cpp | 79 ++++++++++++------------ examples/sprite3dExampleCardFan.cpp | 21 +++---- examples/sprite3dExampleSpinningCard.cpp | 23 ++++--- 9 files changed, 139 insertions(+), 154 deletions(-) diff --git a/examples/bitmapTextExample.cpp b/examples/bitmapTextExample.cpp index 90e481b..3e37c8b 100644 --- a/examples/bitmapTextExample.cpp +++ b/examples/bitmapTextExample.cpp @@ -38,13 +38,13 @@ int main() // standard setup for a font font.setExternalTexture(fontSheetTexture); font.setNumberOfTilesPerRow(16); - font.setDefaultTextureRect({ 0, 0, 8, 8 }); + font.setDefaultTextureRect({ { 0, 0 }, { 8, 8 } }); // customisation for the specific font ("Selba Ward Bitmap Font 0001.png") // customise texture rects for 'j' and 'z' as the glyph for j spills into z - font.setTextureRect({ 80, 48, 8, 9 }, 'j'); - font.setTextureRect({ 80, 57, 8, 7 }, 'z'); + font.setTextureRect({ { 80, 48 }, { 8, 9 } }, 'j'); + font.setTextureRect({ { 80, 57 }, { 8, 7 } }, 'z'); font.setBaseline(-1, 'z'); // starting values @@ -94,23 +94,22 @@ int main() const std::string defaultString = "012 Str;:zingy! qu,ic(k)jumps 57"; const std::string xxxyyyString = "xxxyyyiijiizzJJIIvvvwwyyxxzzz"; text.setString(prefixString + defaultString); - text.setPosition(20, 50); + text.setPosition({ 20, 50 }); text.setScale(2); // scale so we can see the pixels (only accepts unsigned integers - single unsigned int, two unsigned ints, sf::Vector2u) //text.Transformable::setScale(3.5f, 9.75f); // it's still possible to scale by fractional amounts by explicitly calling the Transformable method //text.setTracking(2); // base spacing between characters. default is 1 - sf::RenderWindow window(sf::VideoMode(550, 100), "Bitmap Text example", sf::Style::Default); + sf::RenderWindow window(sf::VideoMode({ 550, 100 }), "Bitmap Text example", sf::Style::Default); window.setFramerateLimit(20); while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - if (event.type == sf::Event::Closed) + if (event->is()) window.close(); - else if (event.type == sf::Event::KeyPressed) + else if (const auto* keyPressed = event->getIf()) { - if (event.key.code == sf::Keyboard::Space) + if (keyPressed->code == sf::Keyboard::Key::Space) { if (text.getString() != prefixString + xxxyyyString) text.setString(prefixString + xxxyyyString); diff --git a/examples/lineExample.cpp b/examples/lineExample.cpp index 01d798d..40bf395 100644 --- a/examples/lineExample.cpp +++ b/examples/lineExample.cpp @@ -41,36 +41,35 @@ int main() std::ios_base::iostate sfErrIoState = sf::err().rdstate(); // stores current state of SFML error stream sf::err().clear(std::ios::failbit); // disables SFML error stream sf::ContextSettings contextSettings; - contextSettings.antialiasingLevel = 8; - sf::RenderWindow window(sf::VideoMode(800, 600), "Line test", sf::Style::Default, contextSettings); + contextSettings.antiAliasingLevel = 8; + sf::RenderWindow window(sf::VideoMode({ 800, 600 }), "Line test", sf::Style::Default, sf::State::Windowed, contextSettings); window.setFramerateLimit(60); sf::err().clear(sfErrIoState); // re-enables SFML error stream (re-enstates the stored state) while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - if (event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) + if (event->is() || event->is() && event->getIf()->code == sf::Keyboard::Key::Escape) window.close(); - else if (event.type == sf::Event::MouseButtonPressed) + else if (const auto* mouseButton = event->getIf()) { - if (event.mouseButton.button == sf::Mouse::Left) + if (mouseButton->button == sf::Mouse::Button::Left) isButtonDown.left = true; - else if (event.mouseButton.button == sf::Mouse::Right) + else if (mouseButton->button == sf::Mouse::Button::Right) isButtonDown.right = true; } - else if (event.type == sf::Event::MouseButtonReleased) + else if (const auto* mouseButton = event->getIf()) { - if (event.mouseButton.button == sf::Mouse::Left) + if (mouseButton->button == sf::Mouse::Button::Left) isButtonDown.left = false; - else if (event.mouseButton.button == sf::Mouse::Right) + else if (mouseButton->button == sf::Mouse::Button::Right) isButtonDown.right = false; } - else if (event.type == sf::Event::MouseWheelMoved) + else if (const auto* mouseWheel = event->getIf()) { const float lineThicknessOffset{ 2.f }; - if (event.mouseWheel.delta > 0) + if (mouseWheel->delta > 0) lineThickness += lineThicknessOffset; else lineThickness -= lineThicknessOffset; diff --git a/examples/progressBarExample.cpp b/examples/progressBarExample.cpp index 4904a5e..f7feab7 100644 --- a/examples/progressBarExample.cpp +++ b/examples/progressBarExample.cpp @@ -29,7 +29,7 @@ int main() return EXIT_FAILURE; } - sf::RenderWindow window(sf::VideoMode(800, 600), "Progress Bar example"); + sf::RenderWindow window(sf::VideoMode({ 800, 600 }), "Progress Bar example"); sw::ProgressBar progressBar({ 300.f, 40.f }); @@ -42,7 +42,7 @@ int main() progressBar.setBackgroundColor(sf::Color(128, 128, 128)); progressBar.setFrameColor(sf::Color(128, 128, 255, 192)); progressBar.setFrameThickness(2.f); - progressBar.setRotation(-30); + progressBar.setRotation(sf::degrees(-30)); // set textures progressBar.setTexture(texture); @@ -56,7 +56,7 @@ int main() // marker std::vector markers(3, sf::CircleShape(3.f)); for (auto& marker : markers) - marker.setOrigin(marker.getRadius(), marker.getRadius()); + marker.setOrigin({ marker.getRadius(), marker.getRadius() }); markers[0].setFillColor(sf::Color::Red); markers[1].setFillColor(sf::Color::Yellow); markers[2].setFillColor(sf::Color::Green); @@ -65,10 +65,9 @@ int main() while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - if ((event.type == sf::Event::Closed) || (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)) + if (event->is() || event->is() && event->getIf()->code == sf::Keyboard::Key::Escape) window.close(); } @@ -78,14 +77,14 @@ int main() float frameTime{ clock.restart().asSeconds() }; - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Add)) // [+] (number pad) increase progress + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Add)) // [+] (number pad) increase progress progressBar.setRatio(progressBar.getRatio() + frameTime * 0.3f); - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Subtract)) // [-] (number pad) decrease progress + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Subtract)) // [-] (number pad) decrease progress progressBar.setRatio(progressBar.getRatio() - frameTime * 0.3f); - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Period)) // [.]/[>] rotate left - progressBar.rotate(frameTime * 30.f); - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Comma)) // [,]/[<] rotate right - progressBar.rotate(-frameTime * 30.f); + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Period)) // [.]/[>] rotate left + progressBar.rotate(sf::degrees(frameTime * 30.f)); + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Comma)) // [,]/[<] rotate right + progressBar.rotate(sf::degrees(-frameTime * 30.f)); window.clear(); window.draw(progressBar); diff --git a/examples/spinningCardExample.cpp b/examples/spinningCardExample.cpp index 691168a..1ab0e6d 100644 --- a/examples/spinningCardExample.cpp +++ b/examples/spinningCardExample.cpp @@ -20,7 +20,7 @@ int main() { - sf::RenderWindow window(sf::VideoMode(500, 500), "Spinning card effect"); + sf::RenderWindow window(sf::VideoMode({ 500, 500 }), "Spinning card effect"); window.setFramerateLimit(60); const std::string faceTextureFilename{ "resources/Card Face - SFML.png" }; @@ -40,12 +40,12 @@ int main() // set up and position cards const sf::Vector2f positionOfSpinningCard{ static_cast(window.getSize().x) / 2, static_cast(window.getSize().y) / 2 }; - faceSprite.setOrigin(faceSprite.getLocalBounds().width / 2, faceSprite.getLocalBounds().height / 2); - backSprite.setOrigin(backSprite.getLocalBounds().width / 2, backSprite.getLocalBounds().height / 2); + faceSprite.setOrigin(faceSprite.getLocalBounds().size / 2.f); + backSprite.setOrigin(backSprite.getLocalBounds().size / 2.f); faceSprite.setPosition(positionOfSpinningCard); backSprite.setPosition(positionOfSpinningCard); - faceSprite.setRotation(10); - backSprite.setRotation(10); + faceSprite.setRotation(sf::degrees(10)); + backSprite.setRotation(sf::degrees(10)); //faceSprite.setColor(sf::Color::Blue); //backSprite.setColor(sf::Color::Green); @@ -68,14 +68,13 @@ int main() while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - if ((event.type == sf::Event::Closed) || (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)) + if (event->is() || event->is() && event->getIf()->code == sf::Keyboard::Key::Escape) window.close(); - if (event.type == sf::Event::KeyPressed) + if (const auto* keyPressed = event->getIf()) { - if (event.key.code == sf::Keyboard::Space) + if (keyPressed->code == sf::Keyboard::Key::Space) { isSpinning = true; clock.restart(); @@ -105,21 +104,21 @@ int main() // smoothly move "out" when spinning const float scale{ 1.f + (0.5f * std::sin(spinAngle * 3.14159f / 360)) }; - cardFace.setScale(scale, scale); - cardBack.setScale(scale, scale); + cardFace.setScale({ scale, scale }); + cardBack.setScale({ scale, scale }); } window.clear(); // side cards (must return for the central card) - backSprite.move(-120, 0); - backSprite.rotate(-2); + backSprite.move({ -120, 0 }); + backSprite.rotate(sf::degrees(-2)); window.draw(backSprite); - backSprite.move(240, 0); - backSprite.rotate(4); + backSprite.move({ 240, 0 }); + backSprite.rotate(sf::degrees(4)); window.draw(backSprite); - backSprite.move(-120, 0); - backSprite.rotate(-2); + backSprite.move({ -120, 0 }); + backSprite.rotate(sf::degrees(-2)); // central card if (isSpinning) diff --git a/examples/splineExample.cpp b/examples/splineExample.cpp index c2fcd3d..14b50a3 100644 --- a/examples/splineExample.cpp +++ b/examples/splineExample.cpp @@ -29,7 +29,7 @@ int main() { - sf::RenderWindow window(sf::VideoMode(800, 600), "Selba Ward - Spline example", sf::Style::Default); + sf::RenderWindow window(sf::VideoMode({ 800, 600 }), "Selba Ward - Spline example", sf::Style::Default); window.setFramerateLimit(15); const unsigned int numberOfVertices{ 50u }; // number of (control) vertices in spline (one vertex per frame) @@ -40,28 +40,27 @@ int main() while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - if (event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) + if (event->is() || event->is() && event->getIf()->code == sf::Keyboard::Key::Escape) window.close(); - else if (event.type == sf::Event::KeyPressed) + else if (const auto* keyPressed = event->getIf()) { - if (event.key.code == sf::Keyboard::F1) // toggle pause + if (keyPressed->code == sf::Keyboard::Key::F1) // toggle pause isPaused = !isPaused; - else if (event.key.code == sf::Keyboard::Space) // toggle bezier/linear curve mode + else if (keyPressed->code == sf::Keyboard::Key::Space) // toggle bezier/linear curve mode spline.setBezierInterpolation(!spline.getBezierInterpolation()); - else if (event.key.code == sf::Keyboard::Tab) // toggle primitive type + else if (keyPressed->code == sf::Keyboard::Key::Tab) // toggle primitive type { - if (spline.getPrimitiveType() == sf::PrimitiveType::LinesStrip) + if (spline.getPrimitiveType() == sf::PrimitiveType::LineStrip) spline.setPrimitiveType(sf::PrimitiveType::Points); else - spline.setPrimitiveType(sf::PrimitiveType::LinesStrip); + spline.setPrimitiveType(sf::PrimitiveType::LineStrip); } } - else if (event.type == sf::Event::MouseWheelScrolled) + else if (const auto* mouseWheel = event->getIf()) { - const float thickness{ spline.getThickness() + event.mouseWheelScroll.delta }; + const float thickness{ spline.getThickness() + mouseWheel->delta }; spline.setThickness((thickness < 0) ? 0.f : thickness); } } diff --git a/examples/splineExample2.cpp b/examples/splineExample2.cpp index 5fe5240..86979e6 100644 --- a/examples/splineExample2.cpp +++ b/examples/splineExample2.cpp @@ -39,7 +39,7 @@ int main() { - sf::RenderWindow window(sf::VideoMode(800, 600), "Selba Ward - Spline example 2", sf::Style::Default); + sf::RenderWindow window(sf::VideoMode({ 800, 600 }), "Selba Ward - Spline example 2", sf::Style::Default); window.setFramerateLimit(15); const unsigned int numberOfVertices{ 50u }; // number of (control) vertices in spline (one vertex per frame) @@ -50,45 +50,41 @@ int main() while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - switch (event.type) - { - case sf::Event::Closed: + if (event->is()) window.close(); - break; - case sf::Event::KeyPressed: - switch (event.key.code) + else if (const auto* keyPressed = event->getIf()) + switch (keyPressed->code) { - case sf::Keyboard::Escape: + case sf::Keyboard::Key::Escape: // close window.close(); break; - case sf::Keyboard::F1: + case sf::Keyboard::Key::F1: // toggle paused isPaused = !isPaused; break; - case sf::Keyboard::Space: + case sf::Keyboard::Key::Space: // toggle interpolation type spline.setBezierInterpolation(!spline.getBezierInterpolation()); break; - case sf::Keyboard::Tab: + case sf::Keyboard::Key::Tab: // toggle primitive type - if (spline.getPrimitiveType() == sf::PrimitiveType::LinesStrip) + if (spline.getPrimitiveType() == sf::PrimitiveType::LineStrip) spline.setPrimitiveType(sf::PrimitiveType::Points); else - spline.setPrimitiveType(sf::PrimitiveType::LinesStrip); + spline.setPrimitiveType(sf::PrimitiveType::LineStrip); break; - case sf::Keyboard::BackSpace: + case sf::Keyboard::Key::Backspace: // toggle closed Spline spline.setClosed(!spline.getClosed()); break; - case sf::Keyboard::Slash: + case sf::Keyboard::Key::Slash: // toggle random normal offsets (lightning effect) spline.setRandomNormalOffsetRange(20.f - spline.getRandomNormalOffsetRange()); break; - case sf::Keyboard::LBracket: + case sf::Keyboard::Key::LBracket: // cycle start cap type switch (spline.getThickStartCapType()) { @@ -103,7 +99,7 @@ int main() break; } break; - case sf::Keyboard::RBracket: + case sf::Keyboard::Key::RBracket: // cycle end cap type switch (spline.getThickEndCapType()) { @@ -118,7 +114,7 @@ int main() break; } break; - case sf::Keyboard::Return: + case sf::Keyboard::Key::Enter: // cycle corner type switch (spline.getThickCornerType()) { @@ -134,15 +130,12 @@ int main() } break; } - break; - case sf::Event::MouseWheelScrolled: - // mouse wheel changes thickness + else if (const auto* mouseWheel = event->getIf()) { - const float thickness{ spline.getThickness() + event.mouseWheelScroll.delta }; + // mouse wheel changes thickness + const float thickness{ spline.getThickness() + mouseWheel->delta }; spline.setThickness((thickness < 0) ? 0.f : thickness); } - break; - } } if (!isPaused) diff --git a/examples/sprite3dExample.cpp b/examples/sprite3dExample.cpp index ffa69eb..d545630 100644 --- a/examples/sprite3dExample.cpp +++ b/examples/sprite3dExample.cpp @@ -35,7 +35,7 @@ int main() { // set up window - sf::RenderWindow window(sf::VideoMode(800, 600), "Sprite3d", sf::Style::Default); + sf::RenderWindow window(sf::VideoMode({ 800, 600 }), "Sprite3d", sf::Style::Default); //window.setVerticalSyncEnabled(true); // load resources (textures and font) @@ -53,26 +53,26 @@ int main() return EXIT_FAILURE; // textures are required for this example. it's pointless carrying on without them } sf::Font font; - if (!font.loadFromFile("resources/arial.ttf")) + if (!font.openFromFile("resources/arial.ttf")) std::cerr << "Error loading font." << std::endl; // no need to exit if font fails; it will just not show any text // text headers - sf::Text sprite3dText("Sprite3d", font, 48); - sf::Text spriteText("Sprite", font, 48); - sprite3dText.setOrigin(sprite3dText.getLocalBounds().left + sprite3dText.getLocalBounds().width / 2.f, 0.f); - spriteText.setOrigin(spriteText.getLocalBounds().left + spriteText.getLocalBounds().width / 2.f, 0.f); - sprite3dText.setPosition(sf::Vector2f(window.getSize().x * 0.25f, 0.f)); - spriteText.setPosition(sf::Vector2f(window.getSize().x * 0.75f, 0.f)); + sf::Text sprite3dText(font, "Sprite3d", 48); + sf::Text spriteText(font, "Sprite", 48); + sprite3dText.setOrigin({ sprite3dText.getLocalBounds().position.x + sprite3dText.getLocalBounds().size.x / 2.f, 0.f }); + spriteText.setOrigin({ spriteText.getLocalBounds().position.x + spriteText.getLocalBounds().size.x / 2.f, 0.f }); + sprite3dText.setPosition({ window.getSize().x * 0.25f, 0.f }); + spriteText.setPosition({ window.getSize().x * 0.75f, 0.f }); // text feedback - sf::Text feedbackText("FPS:\nVertices:\nSubdivision Level:\nSubdivided Mesh Density:\nMesh Density:\nDynamic Subdivision enabled:\nMost Extreme Angle:\nDepth:", font, 16); - feedbackText.setOrigin(feedbackText.getLocalBounds().left, feedbackText.getLocalBounds().top + feedbackText.getLocalBounds().height); - feedbackText.setPosition(sf::Vector2f(2.f, window.getSize().y - 1.f)); + sf::Text feedbackText(font, "FPS:\nVertices:\nSubdivision Level:\nSubdivided Mesh Density:\nMesh Density:\nDynamic Subdivision enabled:\nMost Extreme Angle:\nDepth:", 16); + feedbackText.setOrigin({ feedbackText.getLocalBounds().position.x, feedbackText.getLocalBounds().position.y + feedbackText.getLocalBounds().size.y }); + feedbackText.setPosition({ 2.f, window.getSize().y - 1.f }); // sprite3d sw::Sprite3d sprite3d(frontTexture, backTexture); - sprite3d.setOrigin(sf::Vector2f(sprite3d.getLocalBounds().width, sprite3d.getLocalBounds().height) / 2.f); - sprite3d.setPosition(sf::Vector2f(window.getSize().x * 0.25f, window.getSize().y / 2.f)); + sprite3d.setOrigin(sprite3d.getLocalBounds().size / 2.f); + sprite3d.setPosition({ window.getSize().x * 0.25f, window.getSize().y / 2.f }); //sprite3d.setFlipBack(); //sprite3d.setMeshDensity(3); // = 5x5 points = 4x4 quads //sprite3d.setNumberOfPoints(25); // 5x5 @@ -82,8 +82,8 @@ int main() // sprite //sf::Sprite sprite(sprite3d.getSprite()); sf::Sprite sprite(texture); - sprite.setOrigin(sf::Vector2f(sprite.getLocalBounds().width, sprite.getLocalBounds().height) / 2.f); - sprite.setPosition(sf::Vector2f(window.getSize().x * 0.75f, window.getSize().y / 2.f)); + sprite.setOrigin(sprite.getLocalBounds().size / 2.f); + sprite.setPosition({ window.getSize().x * 0.75f, window.getSize().y / 2.f }); // bounds rectangles sf::RectangleShape boundsSprite3d; @@ -105,80 +105,79 @@ int main() while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - if (event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) + if (event->is() || event->is() && event->getIf()->code == sf::Keyboard::Key::Escape) window.close(); - else if (event.type == sf::Event::KeyPressed) + else if (const auto* keyPressed = event->getIf()) { // pause/unpause - if (event.key.code == sf::Keyboard::Space) + if (keyPressed->code == sf::Keyboard::Key::Space) { isPaused = !isPaused; clock.restart(); } // reset time - else if (event.key.code == sf::Keyboard::BackSpace) + else if (keyPressed->code == sf::Keyboard::Key::Backspace) { time = 0.f; clock.restart(); } // control depth - else if (event.key.code == sf::Keyboard::Equal) + else if (keyPressed->code == sf::Keyboard::Key::Equal) sprite3d.setDepth(sprite3d.getDepth() + 1.f); - else if (event.key.code == sf::Keyboard::Dash) + else if (keyPressed->code == sf::Keyboard::Key::Hyphen) sprite3d.setDepth(sprite3d.getDepth() - 1.f); // control mesh density - else if (event.key.code == sf::Keyboard::RBracket) + else if (keyPressed->code == sf::Keyboard::Key::RBracket) sprite3d.setMeshDensity(sprite3d.getMeshDensity() + 1); - else if (event.key.code == sf::Keyboard::LBracket) + else if (keyPressed->code == sf::Keyboard::Key::LBracket) { if (sprite3d.getMeshDensity() > 0) sprite3d.setMeshDensity(sprite3d.getMeshDensity() - 1); } // control subdivision level - else if (event.key.code == sf::Keyboard::Period) + else if (keyPressed->code == sf::Keyboard::Key::Period) sprite3d.setSubdivision(sprite3d.getSubdivision() + 1); - else if (event.key.code == sf::Keyboard::Comma) + else if (keyPressed->code == sf::Keyboard::Key::Comma) { if (sprite3d.getSubdivision() > 0) sprite3d.setSubdivision(sprite3d.getSubdivision() - 1); } // toggle dynamic subdivision - else if (event.key.code == sf::Keyboard::Return) + else if (keyPressed->code == sf::Keyboard::Key::Enter) sprite3d.setDynamicSubdivision(!sprite3d.getDynamicSubdivision()); // toggle back face is flipped state - else if (event.key.code == sf::Keyboard::B) + else if (keyPressed->code == sf::Keyboard::Key::B) sprite3d.setFlipBack(!sprite3d.getFlipBack()); // toggle bounds rectangles - else if (event.key.code == sf::Keyboard::F9) + else if (keyPressed->code == sf::Keyboard::Key::F9) isVisible.sprite3dBounds = !isVisible.sprite3dBounds; - else if (event.key.code == sf::Keyboard::F10) + else if (keyPressed->code == sf::Keyboard::Key::F10) isVisible.spriteBounds = !isVisible.spriteBounds; // toggle whether or not to draw the sprites - else if (event.key.code == sf::Keyboard::F11) + else if (keyPressed->code == sf::Keyboard::Key::F11) isVisible.sprite3d = !isVisible.sprite3d; - else if (event.key.code == sf::Keyboard::F12) + else if (keyPressed->code == sf::Keyboard::Key::F12) isVisible.sprite = !isVisible.sprite; // reset the mesh to minimal (also turns off dynamic subdivision) - else if (event.key.code == sf::Keyboard::F8) + else if (keyPressed->code == sf::Keyboard::Key::F8) { sprite3d.setDynamicSubdivision(false); sprite3d.minimalMesh(); } // toggle texture usage - else if (event.key.code == sf::Keyboard::Tab) + else if (keyPressed->code == sf::Keyboard::Key::Tab) { if (sprite3d.getTexture() != &frontTexture) { @@ -207,7 +206,7 @@ int main() //sprite.setScale({ std::cos(time * 97.f * 3.141592653f / 180.f), std::cos(time * 42.f * 3.141592653f / 180.f) }); sprite.setScale({ std::cos(time * 42 * 3.141592653f / 180.f), std::cos(time * 97 * 3.141592653f / 180.f) }); - sprite.setRotation(time * 51.f); + sprite.setRotation(sf::degrees(time * 51.f)); // other sprite3d rotations for testing //sprite3d.setRotation(time * 60.f); /* @@ -217,10 +216,10 @@ int main() //sprite3d.setYaw(time * 180.f); // update bounds rectangle - boundsSprite3d.setPosition(sf::Vector2f(sprite3d.getGlobalBounds().left, sprite3d.getGlobalBounds().top)); - boundsSprite3d.setSize(sf::Vector2f(sprite3d.getGlobalBounds().width, sprite3d.getGlobalBounds().height)); - boundsSprite.setPosition(sf::Vector2f(sprite.getGlobalBounds().left, sprite.getGlobalBounds().top)); - boundsSprite.setSize(sf::Vector2f(sprite.getGlobalBounds().width, sprite.getGlobalBounds().height)); + boundsSprite3d.setPosition(sprite3d.getGlobalBounds().position); + boundsSprite3d.setSize(sprite3d.getGlobalBounds().size); + boundsSprite.setPosition(sprite.getGlobalBounds().position); + boundsSprite.setSize(sprite.getGlobalBounds().size); // update depth text unsigned int subdividedMeshDensity = sprite3d.getMeshDensity(); diff --git a/examples/sprite3dExampleCardFan.cpp b/examples/sprite3dExampleCardFan.cpp index 1fe5fd2..7e18041 100644 --- a/examples/sprite3dExampleCardFan.cpp +++ b/examples/sprite3dExampleCardFan.cpp @@ -30,7 +30,7 @@ inline float ease(float start, float end, float alpha) int main() { - sf::RenderWindow window(sf::VideoMode(450, 250), "Sprite3d - Card Fan Animation", sf::Style::Default); + sf::RenderWindow window(sf::VideoMode({ 450, 250 }), "Sprite3d - Card Fan Animation", sf::Style::Default); window.setFramerateLimit(60); std::vector cardTextures(7); // 6 faces and 1 back @@ -60,11 +60,11 @@ int main() card.setDepth(30.f); card.setColor(sf::Color::White); card.setSubdivision(2); - card.setOrigin({ card.getLocalBounds().width, card.getLocalBounds().height / 2.f }); // centre-right (left of back, which you see first) + card.setOrigin({ card.getLocalBounds().size.x, card.getLocalBounds().size.y / 2.f }); // centre-right (left of back, which you see first) card.setYaw(180.f); } for (unsigned int c{ 0 }; c < cards.size(); ++c) - cards[c].setPosition(150.f + 30.f * c, 125.f); + cards[c].setPosition({ 150.f + 30.f * c, 125.f }); // adjustable opacity float opacity{ 1.f }; // opacity of cards (0 = fully transparent, 1 = fully opaque) @@ -77,34 +77,33 @@ int main() while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - if (event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) + if (event->is() || event->is() && event->getIf()->code == sf::Keyboard::Key::Escape) window.close(); - else if (event.type == sf::Event::KeyPressed) + else if (const auto* keyPressed = event->getIf()) { // pause/unpause - if (event.key.code == sf::Keyboard::Space) + if (keyPressed->code == sf::Keyboard::Key::Space) { isPaused = !isPaused; clock.restart(); } // reset time - else if (event.key.code == sf::Keyboard::BackSpace) + else if (keyPressed->code == sf::Keyboard::Key::Backspace) { time = 0.f; clock.restart(); } // adjust opacity - else if (event.key.code == sf::Keyboard::LBracket) + else if (keyPressed->code == sf::Keyboard::Key::LBracket) { opacity -= 0.05f; hasOpacityChanged = true; } - else if (event.key.code == sf::Keyboard::RBracket) + else if (keyPressed->code == sf::Keyboard::Key::RBracket) { opacity += 0.05f; hasOpacityChanged = true; diff --git a/examples/sprite3dExampleSpinningCard.cpp b/examples/sprite3dExampleSpinningCard.cpp index 978fc5c..5531e9f 100644 --- a/examples/sprite3dExampleSpinningCard.cpp +++ b/examples/sprite3dExampleSpinningCard.cpp @@ -20,7 +20,7 @@ int main() { - sf::RenderWindow window(sf::VideoMode(500, 500), "Sprite3d simplifying the SpinningCard example"); + sf::RenderWindow window(sf::VideoMode({ 500, 500 }), "Sprite3d simplifying the SpinningCard example"); window.setFramerateLimit(60); const std::string faceTextureFilename{ "resources/Card Face - SFML.png" }; @@ -38,7 +38,7 @@ int main() // set up and position main card const sf::Vector2f positionOfSpinningCard{ static_cast(window.getSize().x) / 2, static_cast(window.getSize().y) / 2 }; - card.setOrigin({ card.getLocalBounds().width / 2, card.getLocalBounds().height / 2 }); + card.setOrigin(card.getLocalBounds().size / 2.f); card.setPosition(sf::Vector2f(window.getSize() / 2u)); card.setRotation(10); card.setSubdivision(2); @@ -48,10 +48,10 @@ int main() // set up static cards std::vector sideCards(2, card.getSprite()); - sideCards.front().rotate(-2); - sideCards.back().rotate(2); - sideCards.front().move(-120, 0); - sideCards.back().move(120, 0); + sideCards.front().rotate(sf::degrees(-2)); + sideCards.back().rotate(sf::degrees(2)); + sideCards.front().move({ -120.f, 0.f }); + sideCards.back().move({ 120.f, 0.f }); // spin control bool isSpinning{ false }; @@ -62,14 +62,13 @@ int main() while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) + while (const std::optional event = window.pollEvent()) { - if ((event.type == sf::Event::Closed) || (event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)) + if (event->is() || event->is() && event->getIf()->code == sf::Keyboard::Key::Escape) window.close(); - if (event.type == sf::Event::KeyPressed) + if (const auto* keyPressed = event->getIf()) { - if (event.key.code == sf::Keyboard::Space) + if (keyPressed->code == sf::Keyboard::Key::Space) { isSpinning = true; clock.restart(); @@ -91,7 +90,7 @@ int main() // update card const float scale{ 1.f + (0.5f * std::sin(spinAngle * 3.14159f / 360)) }; // smoothly move "out" when spinning - card.setScale(scale, scale); + card.setScale({ scale, scale }); if (spinVertically) card.setPitch(spinAngle); else