Since you inherit from sf::Transformable
and sf::Drawable
, you can override the draw
function and apply a custom transform to one sprite and another transform to the other. For example:
#include <SFML/Graphics.hpp>
class X : public sf::Drawable, public sf::Transformable {
sf::Sprite s1, s2;
sf::Texture t;
public:
X() {
sf::Image img; img.create(20, 20, sf::Color::Blue);
t.loadFromImage(img);
s1.setTexture(t);
s2.setTexture(t);
s2.setPosition(50, 50);
}
void draw(sf::RenderTarget& target, sf::RenderStates states) const override {
auto originalStates = states; // save for later 'reset'
auto transform = getTransform();
auto scale = getScale();
transform.scale(1.f/scale.x, 1.f/scale.y); // unscale
states.transform *= transform;
target.draw(s1, states);
states = originalStates;
states.transform *= getTransform();
target.draw(s2, states);
}
};
int main(int, char const**)
{
// Create the main window
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
X x;
// Start the game loop
while (window.isOpen())
{
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window : exit
if (event.type == sf::Event::Closed) {
window.close();
}
if (event.type == sf::Event::KeyPressed) {
if (event.key.code == sf::Keyboard::Up) {
x.scale(1.05, 1.05);
} else if (event.key.code == sf::Keyboard::Down) {
x.scale(0.95, 0.95);
} else if (event.key.code == sf::Keyboard::Right) {
x.move(10, 0);
} else if (event.key.code == sf::Keyboard::Left) {
x.move(-10, 0);
}
}
}
window.clear();
window.draw(x);
window.display();
}
return EXIT_SUCCESS;
}