diff --git a/CMakeLists.txt b/CMakeLists.txt index ec4448a..de3fd30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,3 +18,9 @@ file(GLOB_RECURSE HEADERS CONFIGURE_DEPENDS src/*.hpp) add_executable(SFMLplayground ${SOURCES} ${HEADERS}) target_compile_features(SFMLplayground PRIVATE cxx_std_17) target_link_libraries(SFMLplayground PRIVATE SFML::Graphics) + +add_custom_command( + TARGET SFMLplayground POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_SOURCE_DIR}/src/assets $/assets +) diff --git a/src/DebugOverlay.cpp b/src/DebugOverlay.cpp new file mode 100644 index 0000000..ac5d17a --- /dev/null +++ b/src/DebugOverlay.cpp @@ -0,0 +1,29 @@ +#include "DebugOverlay.hpp" + +#include + +DebugOverlay::DebugOverlay(const std::string& fontPath) + : m_font(fontPath), m_text(m_font) { + m_text.setCharacterSize(16); + m_text.setFillColor(sf::Color::White); + m_text.setPosition(sf::Vector2f(5.f, 5.f)); +} + +void DebugOverlay::update(int drawCalls, float timescale, + const sf::RenderWindow& window) { + float elapsed = m_fpsClock.restart().asSeconds(); + if (elapsed > 0.f) m_fps = static_cast(1.f / elapsed); + + sf::Vector2i mousePos = sf::Mouse::getPosition(window); + + std::ostringstream oss; + oss << "Draw calls: " << drawCalls << "\n"; + oss << "Framerate: " << m_fps << " FPS\n"; + oss << "Frametime: " << (elapsed * 1000.f) << " ms\n"; + oss << "Mouse: " << mousePos.x << ", " << mousePos.y << "\n"; + oss << "Time scale: " << timescale << "\n"; + + m_text.setString(oss.str()); +} + +void DebugOverlay::draw(sf::RenderWindow& window) { window.draw(m_text); } diff --git a/src/DebugOverlay.hpp b/src/DebugOverlay.hpp new file mode 100644 index 0000000..302bd3a --- /dev/null +++ b/src/DebugOverlay.hpp @@ -0,0 +1,20 @@ +#pragma once +#include +#include +#include +#include +#include + +class DebugOverlay { + public: + DebugOverlay(const std::string& fontPath); + + void update(int drawCalls, float timescale, const sf::RenderWindow& window); + void draw(sf::RenderWindow& window); + + private: + sf::Font m_font; + sf::Text m_text; + sf::Clock m_fpsClock; + float m_fps = 0.f; +}; \ No newline at end of file diff --git a/src/Game.cpp b/src/Game.cpp index 8fe1b8f..b673ca9 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -12,7 +12,9 @@ Game::Game() : m_inputManager( std::bind(&Game::processKeyPressed, this, std::placeholders::_1), std::bind(&Game::processMousePressed, this, std::placeholders::_1)), - m_debugLines(sf::PrimitiveType::Lines) { + m_debugLines(sf::PrimitiveType::Lines), + m_drawCallCount(0), + m_debugOverlay("assets/consolas.ttf") { m_window.create(sf::VideoMode({Constants::WIDTH, Constants::HEIGHT}), "SFML Playground"); m_window.setVerticalSyncEnabled(true); @@ -27,10 +29,11 @@ Game::Game() void Game::processKeyPressed(const sf::Event::KeyPressed &kP) { if (kP.code == sf::Keyboard::Key::Equal) { - m_timeScale *= 1.1f; + m_timeScale += 0.25f; + if (m_timeScale > 10.0f) m_timeScale = 10.0f; } else if (kP.code == sf::Keyboard::Key::Hyphen) { - m_timeScale /= 1.1f; - if (m_timeScale < 0.1f) m_timeScale = 0.1f; + m_timeScale -= 0.25f; + if (m_timeScale < 0.25f) m_timeScale = 0.25f; } } @@ -60,9 +63,11 @@ void Game::render() { m_window.clear(sf::Color::Black); m_debugLines.clear(); + m_drawCallCount = 0; for (const auto &object : m_objects) { object->draw(m_window); + m_drawCallCount++; auto *ball = dynamic_cast(object.get()); if (!ball) continue; @@ -72,6 +77,10 @@ void Game::render() { } DebugDraw::drawBatchedLines(m_window, m_debugLines); + m_drawCallCount++; + + m_debugOverlay.update(m_drawCallCount, m_timeScale, m_window); + m_debugOverlay.draw(m_window); m_window.display(); } diff --git a/src/Game.hpp b/src/Game.hpp index 2a84a90..7eca4a2 100644 --- a/src/Game.hpp +++ b/src/Game.hpp @@ -1,5 +1,7 @@ #pragma once +#include #include +#include #include #include #include @@ -8,6 +10,7 @@ #include #include "Ball.hpp" +#include "DebugOverlay.hpp" #include "InputManager.hpp" #include "PhysicalObject.hpp" @@ -22,6 +25,8 @@ class Game { sf::Clock m_clock; InputManager m_inputManager; sf::VertexArray m_debugLines; + int m_drawCallCount = 0; + DebugOverlay m_debugOverlay; void processKeyPressed(const sf::Event::KeyPressed& keyPressed); void processMousePressed(const sf::Event::MouseButtonPressed& mousePressed); void handleMouseClick(const sf::Vector2i& mousePos); diff --git a/src/assets/consolas.ttf b/src/assets/consolas.ttf new file mode 100644 index 0000000..cd4980c Binary files /dev/null and b/src/assets/consolas.ttf differ