1230

2025년 12월 30일

카테고리: 게임엔진, 애니메이션, 트위닝, 코루틴


1230.gif

기존에 있던 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

이 세개만 만들었다.

여러개 다 끝날때까지 기다리는것도 만들어야할듯.