1230
2025년 12월 30일
카테고리: 게임엔진, 애니메이션, 트위닝, 코루틴

기존에 있던 Tween을 쓰면,
간단한 장면은 괜찮지만
매우 복잡한 컷씬의 경우,
bool m_is_a_done
bool m_is_b_done
...
이런식으로 답도 없이
끔찍해진다.
이를 해결하려면
코루틴을 도입해야겠다는 생각이 들었다.
사용법은 대충 이렇게 생겼다.
public:
dp::TweenTask test() {
dp::SystemTween& sys_tween = get_system_tween();
//co_await dp::WaitIdleFrame(sys_tween);
co_await dp::WaitSeconds(sys_tween, 1.0f);
std::cout << "1초가 지났다.\n";
dp::DoTweenInfo info{};
info.Duration = 1.0f;
info.EaseType = dp::EasingType::OutExpo;
info.Object = cr;
info.Type = dp::DoTweenProperty::RectWorldPosition;
info.From = dp::Variant(dp::Vector2f(640, 360 - 200));
info.To = dp::Variant(dp::Vector2f(640 + 200, 360));
co_await dp::DoTween(sys_tween, info);
info.From = dp::Variant(dp::Vector2f(640 + 200, 360));
info.To = dp::Variant(dp::Vector2f(640, 360 + 200));
co_await dp::DoTween(sys_tween, info);
info.From = dp::Variant(dp::Vector2f(640, 360 + 200));
info.To = dp::Variant(dp::Vector2f(640 - 200, 360));
co_await dp::DoTween(sys_tween, info);
info.From = dp::Variant(dp::Vector2f(640 - 200, 360));
info.To = dp::Variant(dp::Vector2f(640, 360 - 200));
co_await dp::DoTween(sys_tween, info);
이런식으로 dp::TweenTask 를 반환하는 함수하나 만들고,
그 안에서 co_await 으로 SystemTween 과 연결된
트위닝을 수행한다.
그리고 밑에처럼
auto* window = get_owner().get_window();
if (window->get_is_key_pressed(dp::bcknd::Key::S)) {
std::cout << "!!\n";
dp::SystemTween& sys_tween = get_system_tween();
sys_tween.start(test());
secs_update = true;
}
sys_tween.start(그_함수())
이렇게 coroutine task 시작해주면 된다.
SystemTween의 구현은,
이전 Tween과 구조 자체는 비슷하다.
코루틴 핸들만 제때제때 resume해주는것만 신경쓰면
별 거 없다.
참고로 시스템 tween은 Scene단에 하나씩 있다.
아무튼
이것만 있으면 복잡한 컷씬도 쉽게 만들수 있다.
현재는 Awaiter로써
- WaitSeconds
- WaitIdleFrame
- DoTween
이 세개만 만들었다.
여러개 다 끝날때까지 기다리는것도 만들어야할듯.