diff --git a/src/main.cpp b/src/main.cpp index 15c4c3c..0d5b788 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,9 +1,16 @@ #include +#include +#include +#include #include +#include +#include #include #include #include #include +#include +#include #include #include @@ -11,34 +18,66 @@ constexpr int DEBUG_REFRESH_RATE_IN_MS = 250; constexpr bool VSYNC = true; constexpr int WIDTH = 1920; constexpr int HEIGHT = 1080; +constexpr float ASPECT = 16.f / 9.f; -void updateShapePosition(sf::RectangleShape &shape, sf::RenderWindow &window) { +constexpr float SPEED = 3.f; + +void updateShapePosition(sf::CircleShape &shape, sf::RenderWindow &window, + sf::View &worldView) { if (!window.hasFocus()) return; - auto shapeSize = shape.getSize(); + auto shapeRadius = shape.getRadius(); auto mousePos = sf::Mouse::getPosition(window); + auto mousePosWorld = window.mapPixelToCoords(mousePos, worldView); - shape.setPosition( - sf::Vector2f(mousePos.x - shapeSize.x / 2, window.getSize().y - 50)); + shape.setPosition(sf::Vector2f(mousePosWorld.x - shapeRadius, + mousePosWorld.y - shapeRadius)); } -std::string getDebugText(double elapsedMilliseconds) { +std::string getDebugText(double elapsedMilliseconds, sf::View &worldView) { if (elapsedMilliseconds <= 0) return ""; + auto viewPos = worldView.getCenter(); + return "V-SYNC: " + std::string(VSYNC ? "On" : "Off") + "\nFrametime: " + std::to_string(elapsedMilliseconds) + - "\nFPS: " + std::to_string((int)(1000 / elapsedMilliseconds)); + "\nFPS: " + std::to_string((int)(1000 / elapsedMilliseconds)) + + "\n\nView x, y: " + std::to_string((int)viewPos.x) + ", " + + std::to_string((int)viewPos.y); +} + +void drawGrid(sf::RenderWindow &window) { + sf::Color gray(64, 64, 64); + sf::VertexArray lines(sf::PrimitiveType::Lines); + + for (float x = 0; x <= WIDTH; x += 20.f) { + lines.append(sf::Vertex{{x, 0.f}, gray}); + lines.append(sf::Vertex{{x, HEIGHT}, gray}); + } + + for (float y = 0; y <= HEIGHT; y += 20.f) { + lines.append(sf::Vertex{{0.f, y}, gray}); + lines.append(sf::Vertex{{WIDTH, y}, gray}); + } + + window.draw(lines); } int main() { sf::RenderWindow window(sf::VideoMode({WIDTH, HEIGHT}), "Whatever SFML"); window.setVerticalSyncEnabled(VSYNC); - sf::RectangleShape shape(sf::Vector2f(200, 25)); + sf::RectangleShape worldLimit({WIDTH - 6, HEIGHT - 6}); + worldLimit.setFillColor(sf::Color::Transparent); + worldLimit.setOutlineColor(sf::Color::Red); + worldLimit.setOutlineThickness(3.f); + worldLimit.setPosition({3.f, 3.f}); + + sf::CircleShape shape(15.f); shape.setFillColor(sf::Color(100, 250, 50)); - shape.setPosition(sf::Vector2f(0, HEIGHT - 50)); + shape.setPosition({0, HEIGHT}); sf::Clock clock; @@ -46,12 +85,12 @@ int main() { if (!font.openFromFile("assets/Consolas.ttf")) return 0; - sf::Text text(font); - text.setString(getDebugText(0)); + sf::Text debugUI(font); + debugUI.setString(""); - sf::View view; - view.setSize(sf::Vector2f(WIDTH, HEIGHT)); - view.setCenter(sf::Vector2f((float)WIDTH / 2, (float)HEIGHT / 2)); + sf::View worldView; + worldView.setSize({WIDTH, HEIGHT}); + worldView.setCenter({(float)WIDTH / 2, (float)HEIGHT / 2}); double lastTextUpdateElapsedMs = 0; @@ -61,17 +100,37 @@ int main() { window.close(); return 0; } else if (event->is()) { - auto size = window.getSize(); - view.setSize(sf::Vector2f(size.x, size.y)); - view.setCenter(sf::Vector2f((float)size.x / 2, (float)size.y / 2)); + auto windowSize = window.getSize(); + float windowRatio = + static_cast(windowSize.x) / static_cast(windowSize.y); + float viewWidth = 1.0f; + float viewHeight = 1.0f; + float posX = 0.0f; + float posY = 0.0f; + + if (windowRatio > ASPECT) { + viewWidth = ASPECT / windowRatio; + posX = (1.0f - viewWidth) / 2.0f; + } else { + viewHeight = windowRatio / ASPECT; + posY = (1.0f - viewHeight) / 2.0f; + } + + worldView.setViewport( + sf::FloatRect({posX, posY}, {viewWidth, viewHeight})); } } + updateShapePosition(shape, window, worldView); + window.clear(); - updateShapePosition(shape, window); - window.setView(view); + + window.setView(worldView); window.draw(shape); - window.draw(text); + drawGrid(window); + // window.draw(worldLimit); + window.draw(debugUI); + window.display(); double elapsedMilliseconds = @@ -80,7 +139,7 @@ int main() { lastTextUpdateElapsedMs += elapsedMilliseconds; if (lastTextUpdateElapsedMs > DEBUG_REFRESH_RATE_IN_MS) { - text.setString(getDebugText(elapsedMilliseconds)); + debugUI.setString(getDebugText(elapsedMilliseconds, worldView)); lastTextUpdateElapsedMs = 0; } }