Merci pour vos réponses, j'ai donc fais un petit code rapide pour reproduire le même schéma, qui comprend le main et ma classe block :
#include <SFML/Graphics.hpp>
class Block : public sf::Drawable, public sf::Transformable
{
public:
// ajoutez des fonctions pour jouer avec la géometrie / couleur / texture de l'entité...
Block();
int applyTexture(std::string path);
void setBlockPosition(int w, int h);
void setBlockRotation(Block& block, int a); // identique à rotate
private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
// on applique la transformation de l'entité -- on la combine avec celle qui a été passée par l'appelant
states.transform *= getTransform(); // getTransform() est définie par sf::Transformable
// on applique la texture
states.texture = &m_texture;
// on dessine le tableau de vertex
target.draw(m_vertices, states);
}
sf::VertexArray m_vertices;
sf::Texture m_texture;
};
Block::Block()
: m_vertices(sf::Quads, 4)
, m_texture()
{}
int Block::applyTexture(std::string path)
{
if (!m_texture.loadFromFile(path))
{
return EXIT_FAILURE;
}
m_vertices[0].texCoords = sf::Vector2f(0, 0);
m_vertices[1].texCoords = sf::Vector2f(10, 0);
m_vertices[2].texCoords = sf::Vector2f(10, 10);
m_vertices[3].texCoords = sf::Vector2f(0, 10);
return EXIT_SUCCESS;
}
void Block::setBlockPosition(int w, int h)
{
m_vertices[0].position = sf::Vector2f(w, h);
m_vertices[1].position = sf::Vector2f(w+10, h);
m_vertices[2].position = sf::Vector2f(w+10, h+10);
m_vertices[3].position = sf::Vector2f(w, h+10);
}
void Block::setBlockRotation(Block& block, int a)
{
block.rotate(a);
}
int main()
{
sf::RenderWindow window;
window.create(sf::VideoMode(400, 400), "Titre", sf::Style::Titlebar | sf::Style::Close);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
Block head;
Block body;
Block bodyTurn;
Block tail;
//head.applyTexture("head.jpg");
//body.applyTexture("body.jpg");
//bodyTurn.applyTexture("body-turn.jpg");
//tail.applyTexture("tail.jpg");
window.clear(sf::Color::Black);
head.setBlockPosition(210, 180);
window.draw(head);
bodyTurn.setBlockPosition(210, 190);
bodyTurn.setBlockRotation(bodyTurn, 10);
window.draw(bodyTurn);
bodyTurn.setBlockPosition(200, 190); // vu que c'est le même bloc je dois remettre la même
bodyTurn.setBlockRotation(bodyTurn, -10); // rotation négative pour qu'il revienne à la bonne place
window.draw(bodyTurn);
body.setBlockPosition(200, 200);
window.draw(body);
tail.setBlockPosition(200, 210);
window.draw(tail);
window.display();
}
return 0;
}
Et voici le résultat :