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++
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));
|
|
}
|
|
}
|