#include "headers/scroll_view.hpp" namespace asloengine { ScrollView::ScrollView(sf::String _name, sf::Vector2f _size, float _max_scroll_amount, float _scroll_speed) : size(_size), max_scroll_amount(_max_scroll_amount), scroll_speed(_scroll_speed), GameObject(_name), Clickable(sf::Mouse::Left) {} ScrollView::~ScrollView() {} void ScrollView::set_rotation(float _rotation) {} void ScrollView::draw() { sf::View default_view = change_view(); for (GameObject *const& object : objects) { object->draw(); } render_window->setView(default_view); } void ScrollView::on_start() { set_clickable(sf::FloatRect(get_position().x - origin.x * size.x, get_position().y - origin.y * size.y, size.x, size.y), render_window); for (GameObject *const& object : objects) { object->start(render_window); } } void ScrollView::on_update(float delta_time) { if (is_mouse_in()) { scroll_amount -= Mouse::mouse_wheel_delta * scroll_speed; scroll_amount = clamp(scroll_amount, 0, max_scroll_amount); } sf::View default_view = change_view(); for (GameObject *const& object : objects) { object->update(delta_time); if (!object->alive) { needs_clean = true; } } if (needs_clean) { clean(); } render_window->setView(default_view); } void ScrollView::clean() { for (int i = 0; i < objects.size(); i++) { objects.erase(objects.begin() + i); } needs_clean = false; } void ScrollView::on_destroy() { for (GameObject *const& object : objects) { object->destroy(); } } sf::View ScrollView::change_view() { sf::View default_view = render_window->getView(); sf::View view = default_view; sf::Vector2u window_size = render_window->getSize(); sf::Vector2f camera_center = default_view.getCenter() - default_view.getSize() / 2; view.reset(sf::FloatRect(0, 0 + scroll_amount, size.x, size.y)); view.setViewport(sf::FloatRect( (position.x - camera_center.x - size.x * origin.x) / window_size.x, (position.y - camera_center.y - size.y * origin.y) / window_size.y, size.x / window_size.x, size.y / window_size.y )); render_window->setView(view); return default_view; } }