You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
3.2 KiB
C++

#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include "background.hpp"
namespace Proto4 {
void Background::init(sf::Texture bg0, sf::Texture bg1,
sf::View &rootView) {
bg0Tex = bg0;
bg1Tex = bg1;
bg0Tex.setRepeated(true);
bg1Tex.setRepeated(true);
bg0Tex.setSmooth(true);
bg1Tex.setSmooth(true);
bg0Sprite.setTexture(bg0Tex);
bg1Sprite.setTexture(bg1Tex);
bg0View = bg1View = rootView;
bg0Size = bg0Tex.getSize().x;
bg1Size = bg1Tex.getSize().x;
sf::Vector2f rootViewSize = rootView.getSize();
bg0Sprite.setTextureRect(sf::IntRect(0, 0,
rootViewSize.x + 2 * bg0Size,
rootViewSize.y + 2 * bg0Size));
bg1Sprite.setTextureRect(sf::IntRect(0, 0,
rootViewSize.x + 2 * bg0Size,
rootViewSize.y + 2 * bg0Size));
bg0Sprite.setPosition(rootView.getCenter() - rootViewSize * 0.5f);
bg1Sprite.setPosition(rootView.getCenter() - rootViewSize * 0.5f);
}
void Background::update(sf::View &rootView, sf::RenderTarget &window) {
// parallax
bg0View.setCenter(rootView.getCenter() / 3.5f);
bg1View.setCenter(rootView.getCenter() / 2.f);
// move endless backgrounds if parallax has moved one -step, to offset
// parallax-movement
sf::Vector2i bg0Pos =
window.mapCoordsToPixel(bg0Sprite.getPosition(), bg0View);
if (bg0Pos.x >= 0)
bg0Sprite.move(sf::Vector2f(-bg0Size, 0));
else if (bg0Pos.x <= -2 * bg0Size)
bg0Sprite.move(sf::Vector2f(bg0Size, 0));
if (bg0Pos.y >= 0)
bg0Sprite.move(sf::Vector2f(0, -bg0Size));
else if (bg0Pos.y <= -2 * bg0Size)
bg0Sprite.move(sf::Vector2f(0, bg0Size));
sf::Vector2i bg1Pos =
window.mapCoordsToPixel(bg1Sprite.getPosition(), bg1View);
if (bg1Pos.x >= 0)
bg1Sprite.move(sf::Vector2f(-bg1Size, 0));
else if (bg1Pos.x <= -2 * bg1Size)
bg1Sprite.move(sf::Vector2f(bg1Size, 0));
if (bg1Pos.y >= 0)
bg1Sprite.move(sf::Vector2f(0, -bg1Size));
else if (bg1Pos.y <= -2 * bg1Size)
bg1Sprite.move(sf::Vector2f(0, bg1Size));
}
void Background::draw(sf::RenderTarget &target,
sf::RenderStates states) const {
target.setView(bg0View);
target.draw(bg0Sprite);
target.setView(bg1View);
target.draw(bg1Sprite);
}
void Background::resize(sf::Event &resizeEvent) {
bg0View.setSize(resizeEvent.size.width, resizeEvent.size.height);
bg1View.setSize(resizeEvent.size.width, resizeEvent.size.height);
bg0Sprite.setTextureRect(
sf::IntRect(0, 0, resizeEvent.size.width + 2 * bg0Size,
resizeEvent.size.height + 2 * bg0Size));
bg1Sprite.setTextureRect(
sf::IntRect(0, 0, resizeEvent.size.width + 2 * bg1Size,
resizeEvent.size.height + 2 * bg1Size));
}
}