Esempio n. 1
0
    /// <summary>
    /// 현재 존재하는 오브젝트들만 toLayer 의 상태에 맞춰 트랜지션. (자동재생 아님)
    /// 다음으로 넘기기 위해 Swipe하는 도중에 화면에 보여지는 상태.
    /// </summary>
    /// <param name="toLayer"></param>
    /// <param name="ratio">트랜지션 비율. 0 : 현재 상태 그대로, 1 : 완전히 toLayer 상태로</param>
    /// <param name="backward">진행 반대 방향으로 swipe를 한 경우에는 false</param>
    public void OldElementOnlyTransition(FSNSnapshot.Layer toLayer, float ratio, bool backward)
    {
        UpdateTargetLayerDiff(toLayer);                                                                                         // 비교 업데이트

        // *** 유지되는 오브젝트들
        IterateMatchingUIDs((int uId) =>
        {
            m_objectDict[uId].TransitionWith(toLayer.GetElement(uId) as ElmT, ratio);
        });

        // *** 다음에 사라지는 오브젝트들
        IterateOnlyInThisUIDs((int uId) =>
        {
            var currentElem = toLayer.GetRemovedElementOrNull(uId)                                                       // (정방향) 다음 레이어에 지워지는 해당 오브젝트에 관한 정보가 있다면 얻어오고
                              ?? m_curLayerRef.GetElement(uId);                                                          // 아니면 현재 레이어의 해당 오브젝트를 얻는다

            var finalElem = (!backward)?  currentElem.GenericFinalState                                                  // 정방향일 경우 마지막 스테이트로 움직인 뒤 소멸,
                                                                                :       currentElem.GenericInitialState; // 역방향일 경우 최초 스테이트로 움직인 뒤 소멸해야한다.

            m_objectDict[uId].TransitionWith(finalElem as ElmT, ratio);
        });
    }
Esempio n. 2
0
    /// <summary>
    /// 트랜지션 애니메이션 시작.
    /// </summary>
    /// <param name="toLayer"></param>
    /// <param name="startRatioForOlds">기존 오브젝트들은 해당 비율부터 애니메이션 시작</param>
    /// <param name="backward">진행 반대 방향으로 swipe를 한 경우에는 false</param>
    /// <returns>트랜지션이 모두 끝나는데 걸리는 시간</returns>
    public float StartTransition(FSNSnapshot.Layer toLayer, IInGameSetting nextSetting, float startRatioForOlds, bool backward)
    {
        UpdateTargetLayerDiff(toLayer);                                                                                         // 비교 업데이트
        float longestDuration = 0f;                                                                                             // 트랜지션 중 제일 오래걸리는 것의 시간

        // *** 유지되는 오브젝트들
        IterateMatchingUIDs((int uId) =>
        {
            var elem     = toLayer.GetElement(uId) as ElmT;
            float trTime = elem.TransitionTime / nextSetting.TransitionSpeedRatio;                // 전환속도 비율 적용

            m_objectDict[uId].DoTransition(elem, startRatioForOlds, trTime, false);

            if (longestDuration < trTime)
            {
                longestDuration = trTime;                                                               // 제일 긴 트랜지션 시간 추적하기
            }
        });

        // *** 다음에 사라지는 오브젝트들
        IterateOnlyInThisUIDs((int uId) =>
        {
            var currentElem = m_curLayerRef.GetElement(uId);                                                         // 다음 레이어에 없어질 현재 레이어 객체

            var refelem = toLayer.GetRemovedElementOrNull(uId)                                                       // (정방향) 다음 레이어에 지워지는 해당 오브젝트에 관한 정보가 있다면 이것을 사용
                          ?? currentElem;                                                                            // 아니면 현재 레이어의 해당 오브젝트를 사용하여 finalState를 구한다
            var finalElem = (!backward)?  refelem.GenericFinalState                                                  // 정방향일 경우 마지막 스테이트로 움직인 뒤 소멸,
                                                                                :       refelem.GenericInitialState; // 역방향일 경우 최초 스테이트로 움직인 뒤 소멸해야한다.
            float trTime = finalElem.TransitionTime / nextSetting.TransitionSpeedRatio;                              // 전환속도 비율 적용

            m_objectDict[uId].DoTransition(finalElem as ElmT, startRatioForOlds, trTime, true);

            if (longestDuration < trTime)
            {
                longestDuration = trTime;                                                               // 제일 긴 트랜지션 시간 추적하기
            }
        });

        // *** 다음에 처음 등장하는 오브젝트들
        IterateOnlyInOtherUIDs((int uId) =>
        {
            var currentElem = toLayer.GetElement(uId);                                                       // 다음 레이어의 해당 객체

            var refelem = m_curLayerRef.GetRemovedElementOrNull(uId)                                         // (역방향) 현재 레이어에 지워진 오브젝트의 정보가 있다면 그것을 사용,
                          ?? currentElem;                                                                    // 아니면 다음 레이어의 오브젝트를 참조해서 InitialState를 구한다
            var initialElem = backward?     refelem.GenericFinalState
                                                                        :       refelem.GenericInitialState; // 역방향이면 finalState, 정방향이면 InitialState 로 초기세팅한다
            float trTime = initialElem.TransitionTime / nextSetting.TransitionSpeedRatio;                    // 현재 상태로 transition하지만 시간값은 최초 상태값에 지정된 걸 사용한다.

            var newobj = AddNewLayerObject(initialElem as ElmT, nextSetting);
            newobj.DoTransition(currentElem as ElmT, 0, trTime, false);

            if (longestDuration < trTime)
            {
                longestDuration = trTime;                                                               // 제일 긴 트랜지션 시간 추적하기
            }
        });


        // NOTE : 트랜지션이 완전히 끝난 뒤에 레이어를 교체해야할 수도 있다. 이슈가 생기면 그때 바꾸자...
        m_curLayerRef = toLayer;                                                                                                // 현재 레이어를 트랜지션 타겟 레이어로 교체.

        OnLayerTransitionStart(toLayer);                                                                                        // 이벤트 호출


        return(m_useTransitionDelay? longestDuration : 0);                                                      // 트랜지션 딜레이를 사용하지 않는다면 딜레이 시간은 0으로
    }