Điều này có vẻ như bạn muốn thao tác vị trí và xoay của các đối tượng theo thời gian. AFAIK sfml không cung cấp chức năng này ngay lập tức, nhưng nó khá dễ dàng và đơn giản để tự thực hiện việc này.
Tôi đã từng xây dựng một giải pháp tương tự cho một mô phỏng ba chiều, nhưng nó sẽ dịch tốt sang một ứng dụng đồ họa 2D.
Đầu tiên bạn có hai khái niệm: Manipulator
và theo ManipulatorManager
. Manipulator
là một lớp cơ sở trừu tượng cho tất cả các loại thao tác của một đối tượng cụ thể, ví dụ như một sprite. Thao tác có thể là tất cả các thuộc tính như vị trí hoặc xoay, di chuyển trên một đường dẫn hoặc bất cứ thứ gì tương tự. Các Manager
đồng hồ trạng thái của Manipulators
và cập nhật chúng mỗi khung.
Giao diện cho trình thao tác trông giống như thế:
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;
}
Một triển khai của lớp này là cái SimpleLineManipulator
có ảnh hưởng đến vị trí của một sprite trong một thời gian nhất định trên một đường thẳng:
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
}
Và đây là cách phương thức cập nhật trông như thế nào (nơi diễn ra hầu hết các công việc):
void SimpleLineManipulator::update(float dt) {
Manipulator::update(dt);
Vector2f position = lerp(end, begin, total_time/expiration_time);
spr->SetPosition(position.x, position.y);
}
Tất cả bạn phải làm bây giờ là gọi update()
phương thức mỗi khung. Thật dễ dàng để thực hiện một trình điều khiển xoay hoặc trình điều khiển hoạt động trên một đường dẫn (một danh sách các vị trí). Bây giờ bạn cũng có thể kết hợp các thao tác này để tạo hiệu ứng kết hợp.
Tôi hy vọng tôi có thể phác thảo kiến trúc một cách rõ ràng. Mạnh dạn hỏi :)