AsloEngine/asloengine/builtin/scroll_view.cpp
2019-08-29 18:42:28 +02:00

114 lines
No EOL
2.6 KiB
C++
Executable file

#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;
}
}