Parece que você deseja manipular a posição e a rotação dos objetos ao longo do tempo. O AFAIK sfml não fornece essa funcionalidade imediatamente, mas deve ser bastante fácil e direto implementá-la por conta própria.
Certa vez, construí uma solução semelhante para uma simulação tridimensional, mas ela deve se traduzir bem em uma aplicação gráfica 2D.
Primeiro de você tem dois conceitos: o Manipulator
e o acordo ManipulatorManager
. Manipulator
é uma classe base abstrata para todos os tipos de manipulações de um objeto específico, por exemplo, um sprite. Manipuladas podem ser todas as propriedades, como posição ou rotação, mover-se em um caminho ou algo semelhante. O Manager
vigia o estado da Manipulators
e atualiza-los cada frame.
A interface do manipulador se parece com isso:
class Manipulator {
public:
Manipulator(float expiration_time) : expiration_time(expiration_time);
bool is_expired() { return expiration_time < 0.f; }
void update(float dt) { this->expiration_time -= dt; }
protected:
float expiration_time;
}
Uma implementação dessa classe é a SimpleLineManipulator
que influencia a posição de um sprite em um determinado período em uma linha reta:
class SimpleLineManipulator {
SimpleLineManipulator(Sprite *spr, Vector2f begin, Vector2f end, float expiration_time);
...
private:
Sprite* sprite;
Vector2f begin, end;
float total_time; // initialized with expiration_time
}
E é assim que o método de atualização se parece (onde ocorre a maior parte do trabalho):
void SimpleLineManipulator::update(float dt) {
Manipulator::update(dt);
Vector2f position = lerp(end, begin, total_time/expiration_time);
spr->SetPosition(position.x, position.y);
}
Tudo o que você precisa fazer agora é chamar o update()
método de cada quadro. Deve ser fácil implementar um manipulador rotatório ou manipuladores que funcionem em um caminho (uma lista de posições). Agora você também pode combinar esses manipuladores para criar efeitos combinados.
Espero poder delinear a arquitetura de uma maneira clara. Sinta-se a vontade para perguntar :)