Esempio n. 1
0
    /// <summary>
    /// 텍스트들을 일정 방향으로 모두 밀어내며 삭제한다.
    /// </summary>
    /// <param name="layer"></param>
    /// <param name="direction"></param>
    private static void ClearTextsToDirection(FSNSnapshot.Layer layer, FSNInGameSetting.FlowDirection direction)
    {
        Vector3 screenHalf = FSNEngine.Instance.ScreenDimension * 0.5f;                                 // 화면 크기 절반
        Vector3 dirVec     = FSNInGameSetting.GetUnitVectorFromFlowDir(direction);                      // 흐름 방향 벡터

        var uidList = layer.UniqueIDList;
        int count   = uidList.Count;

        int[] removeIDList = new int[uidList.Count];
        uidList.CopyTo(removeIDList, 0);

        for (int i = 0; i < count; i++)
        {
            var textElem = layer.GetElement(removeIDList[i]) as SnapshotElems.Text;

            textElem.FinalState.Position = textElem.Position + Vector3.Scale(screenHalf, dirVec);                       // 화면 절반 거리만큼 해당 방향으로 이동
            layer.RemoveElement(removeIDList[i]);
        }
    }
    /// <summary>
    /// 오브젝트 삭제 커맨드 처리
    /// </summary>
    /// <param name="segment"></param>
    /// <param name="layer"></param>
    void RemoveElement(SegT segment, FSNSnapshot.Layer layer)
    {
        int uid;

        if (!FindUIDFromLookupDict(segment.objectName, out uid, layer))         // 이름으로 uid 찾기
        {
            Debug.LogError("cannot find SnapshotElem named " + segment.objectName);
        }

        var elem = layer.GetElement(uid) as ElemT;

        AutoSetFinalState(elem);                                                                // Final State가 하나도 세팅되지 않은 경우, 기본값부터 세팅

        SetElemBySegProperties(elem, segment);                                                  // 마지막 설정값들 세팅
        elem.motionState = SnapshotElems.ObjectBase <ElemT> .State.MotionKey;

        OnRemoveElement(segment, layer, elem);                                          // 추가 동작 실행

        CalculateStates(elem);                                                          // 지금까지 좌표값들 보간

        RemoveFromLookupDict(segment.objectName, layer);                                // 제거
        layer.RemoveElement(uid);
    }
Esempio n. 3
0
    /// <summary>
    /// Layer 안에 들어있는 텍스트들을 특정 방향으로 모두 밀어낸다. 알파값도 변경. 수명이 다 된 것은 제거 처리.
    /// </summary>
    /// <param name="layer">변경할 레이어 (이미 복제된 상태여야함)</param>
    /// <param name="direction"></param>
    /// <param name="newTextSize"></param>
    private static void PushTextsToDirection(FSNSnapshot.Layer layer, FSNInGameSetting.FlowDirection direction, Vector2 newTextSize, float paraSpacing = 0)
    {
        Vector2    dirVec      = FSNInGameSetting.GetUnitVectorFromFlowDir(direction);
        List <int> UIDtoRemove = new List <int>();              // 삭제 리스트

        foreach (var uId in layer.UniqueIDList)
        {
            var textElem = layer.GetElement(uId) as SnapshotElems.Text;
            int elemAge  = textElem.ChainedParentCount;

            // 텍스트의 종류에 따라서 다른 룰을 적용한다.

            if (textElem.type == SnapshotElems.Text.Type.Normal)                                                        // ** 일반 텍스트
            {
                Vector3 transVec = Vector2.Scale(newTextSize, dirVec);                                                  // 이동할 벡터 양
                if (elemAge > 0)
                {
                    transVec += (Vector3)(dirVec * paraSpacing);                                                                        // 최초에 등장한 이후엔 문단 간격도 적용
                }
                if (elemAge < c_textLife)                                                                                               // 텍스트가 아직 살아있어야하는 경우
                {
                    textElem.Alpha    = (float)(c_textLife - elemAge) / (float)c_textLife;
                    textElem.Position = textElem.Position + transVec;
                    CopyCurrentToFinal(textElem);                                                                                               // 임시 FinalState
                }
                else
                {                                                                                                                                                               // 텍스트가 죽어야하는 경우
                    textElem.FinalState.Position = textElem.Position + transVec;
                    UIDtoRemove.Add(uId);
                }
            }
            else
            {                                                                                                 // ** 기타 (선택지 관련 텍스트)
                int killAge = textElem.type == SnapshotElems.Text.Type.OptionTexts? 1 : 2;                    //(선택한 텍스트는 1턴 더 살아있어야 하므로)

                if (elemAge == killAge)                                                                       // 없어지는 타이밍
                {
                    // NOTE : 현재 구조상의 문제로 인해 분기점 이후 바로 없어지는 오브젝트의 FinalState를 여러개 둘 수 없음.
                    // 따라서 분기점 이후에도 한번은 오브젝트를 살려놓은 뒤 안보이게만 하고 다음번에 없애는 식으로.

                    Vector2 halfScreen = FSNEngine.Instance.ScreenDimension / 2f;
                    Vector3 transVec   = Vector2.Scale(dirVec, halfScreen);

                    textElem.Position = textElem.Position + transVec;
                    textElem.Alpha    = 0f;

                    // TODO : Alpha를 0으로 하는 것 이외에 실제로 visible을 끌 수 있는 방법이 있다면 사용하도록 한다. 지금도 딱히 문제는 없긴 한데...
                }
                else if (elemAge == killAge + 1)                                                                                                // 원래 없어져야했던 타이밍이 지나고 나서 실제로 없앤다.
                {
                    UIDtoRemove.Add(uId);
                }
            }
        }

        int rmvCount = UIDtoRemove.Count;

        for (int i = 0; i < rmvCount; i++)                                                                                                      // 삭제 리스트 처리
        {
            layer.RemoveElement(UIDtoRemove[i]);
        }
    }