#include "common.hpp" namespace interface { state_t::state_t(sf::RenderWindow *window_, game::state_t *game_) { window = window_; game = game_; } static sf::Vector2f compute_drag(sf::RenderWindow *window, sf::Vector2f drag_ref) { sf::Vector2i mouse = sf::Mouse::getPosition(*window); sf::Vector2f vmouse = window->mapPixelToCoords(mouse); return -(vmouse - drag_ref); } void state_t::tick(void) { sf::Vector2u size; sf::Event event; sf::Vector2f view_size; size = window->getSize(); camera.zoom = (camera.zoom + camera.target_zoom) / 2; { float view_scale; view_scale = 3 * exp(camera.zoom * 0.3); if (size.x > size.y) { view_size.y = view_scale; view_size.x = view_scale * size.x / size.y; } else { view_size.x = view_scale; view_size.y = view_scale * size.y / size.x; } window->setView(sf::View(camera.center, view_size)); } while (window->pollEvent(event)) { switch (event.type) { case sf::Event::Closed: window->close(); return; case sf::Event::MouseButtonPressed: if (event.mouseButton.button == 1) { camera.dragging = true; camera.drag_ref = window->mapPixelToCoords( sf::Vector2i(event.mouseButton.x, event.mouseButton.y)); } break; case sf::Event::MouseButtonReleased: if (event.mouseButton.button == 1) { if (camera.dragging) camera.center += compute_drag(window, camera.drag_ref); camera.dragging = false; } break; case sf::Event::MouseWheelScrolled: camera.target_zoom -= event.mouseWheelScroll.delta; if (camera.target_zoom < 0) camera.target_zoom = 0; if (camera.target_zoom > 10) camera.target_zoom = 10; break; default:; } } if (camera.dragging) { sf::Vector2f delta = compute_drag(window, camera.drag_ref); window->setView(sf::View(camera.center + delta, view_size)); } else window->setView(sf::View(camera.center, view_size)); } } // namespace interface