Et bien c'est tout bête, si tu veux que ta translation s'applique sur le repère d'origine et non le repère tourné, il faut appliquer la translation en premier.
transform.translate(x, y).rotate(a);
Si tu veux le même comportement que les entités SFML (sprite, text, shape) tu peux aussi utiliser la classe sf::Transformable.
ensuite, dans mon cas, ma classe stocke un sf::RenderStates, et chaque modification lui est apporter, puis il est fournit a draw(). ce qui signifie qu'une modification peut arriver sans ordre précis...
Dans ce cas, si tu veux qu'une nouvelle transformation s'applique au repère d'origine plutôt qu'au repère courant, il faut effectivement stocker séparément les composantes de la transformation finale (translation, rotation, scale) et les recombiner à chaque fois dans l'ordre voulu. Ca tombe bien, c'est exactement ce que fait sf::Transformable ;)
Du coup tu as le choix, comme expliqué dans la doc, entre une utilisation interne :
class MyClass
{
...
sf::Transformable m_transform;
};
m_transform.move(x, y);
m_transform.rotate(a);
...
// dans le draw :
states.transform *= m_transform.getTransform();
... ou bien en classe de base, si tu veux que ta classe hérite de toutes ces fonctions de transformation dans son API publique :
class MyClass : public sf::Transformable
{
...
};
move(x, y);
rotate(a);
...
// dans le draw :
states.transform *= getTransform();
Encore une fois, il me semble que tout ceci est très clairement expliqué dans la doc et le tutoriel correspondant.