コード例 #1
0
    /// <summary>
    /// 默认放一个位置
    /// </summary>
    /// <returns></returns>
    public static RayClickPos GetFirstPos(MapUtil.SetType setType)
    {
        RayClickPos ret = new RayClickPos();

        ret.pos      = Vector3.zero;
        ret.wallType = Enum_Wall.Wall;

        Vector3 pos = new Vector3(Screen.width / 2, Screen.height / 2, 0f);

        if (setType == SetType.Floor)
        {
            pos.y = Screen.height / 4;
        }

        Ray        ray = Camera.main.ScreenPointToRay(pos);
        RaycastHit hitInfo;

        if (Physics.Raycast(ray, out hitInfo, 100, JerryUtil.MakeLayerMask(JerryUtil.MakeLayerMask(false), GetWallLayerNames(setType))))
        {
            if (hitInfo.collider != null &&
                hitInfo.collider.gameObject != null)
            {
                ret.pos      = hitInfo.point;
                ret.wallType = WallLayer2WallEnum(hitInfo.collider.gameObject.layer);
            }
        }
        else
        {
            Debug.LogError("first error");
        }

        return(ret);
    }
コード例 #2
0
    /// <summary>
    /// 创建房子
    /// </summary>
    /// <param name="houseNodeIdx">节点索引</param>
    /// <param name="floor">层数,第一层是0</param>
    private void CreateHouse(int houseNodeIdx, int floor)
    {
        curHouseNodeIdx = houseNodeIdx;
        curFloor        = floor;

        //GridMgr.Inst.RefreshPos();
        MeshDraw.Inst.RefreshPos();

        MapUtil.ResetMapStartPosY();

        //回到上一次的房子
        if (houses[curHouseNodeIdx] != null &&
            houses[curHouseNodeIdx].floor == curFloor)
        {
            //Debug.LogWarning(curFloor);
            return;
        }

        MapUtil.ResetMapFlag();
        //新房子
        houses[curHouseNodeIdx] = JerryUtil.CloneGo <House>(new JerryUtil.CloneGoData()
        {
            parant = houseNode[curHouseNodeIdx],
            prefab = housePrefab.gameObject,
            active = true,
            clean  = true,
        });
        houseNode[curHouseNodeIdx].position = new Vector3(0, GetHouseYOffset, 0);
        houses[curHouseNodeIdx].Init(curFloor);
    }
コード例 #3
0
 public void OnDrag(UnityEngine.EventSystems.PointerEventData eventData)
 {
     if (m_Canvas != null)
     {
         this.transform.localPosition = JerryUtil.PosScreen2Canvas(m_Canvas, JerryUtil.GetClickPos(), this.transform);
     }
 }
コード例 #4
0
ファイル: Furniture.cs プロジェクト: laijingfeng/RoomTest
 private void UpdateCtr()
 {
     if (m_Selected && Input.GetKeyDown(KeyCode.N))
     {
         Flag.Inst.Set2Pos(JerryUtil.GetClickPos() - m_Offset);
     }
 }
コード例 #5
0
    void Awake()
    {
        grid   = this.transform.FindChild("Grid");
        prefab = this.transform.FindChild("Prefab");
        prefab.gameObject.SetActive(false);

        grids = new Grid[Width, Height];
        for (int j = 0; j < Height; j++)
        {
            for (int i = 0; i < Width; i++)
            {
                grids[i, j] = JerryUtil.CloneGo <Grid>(new JerryUtil.CloneGoData()
                {
                    parant = grid,
                    prefab = prefab.gameObject,
                    clean  = false,
                    active = true,
                    name   = string.Format("{0}_{1}", j, i),
                });
                grids[i, j].Init(new Grid.GridData()
                {
                    x     = i,
                    y     = j,
                    state = GetState(i, j),
                });
            }
        }
    }
コード例 #6
0
        private void TryWork()
        {
            rectTran = this.transform as RectTransform;
            switch (config.dir)
            {
            case GridLayoutGroup.Axis.Horizontal:
            {
                (rectTran.parent as RectTransform).pivot = new Vector2(0, 0.5f);
                rectTran.anchorMin = new Vector2(0, 0.5f);
                rectTran.anchorMax = new Vector2(0, 0.5f);
            }
            break;

            case GridLayoutGroup.Axis.Vertical:
            {
                (rectTran.parent as RectTransform).pivot = new Vector2(0.5f, 1.0f);
                rectTran.anchorMin = new Vector2(0.5f, 1.0f);
                rectTran.anchorMax = new Vector2(0.5f, 1.0f);
            }
            break;
            }
            rectTran.pivot = new Vector2(0, 1);

            JerryUtil.DestroyAllChildren(this.transform, true);

            ResetPos();
            ResetDelta();
        }
コード例 #7
0
ファイル: Furniture.cs プロジェクト: laijingfeng/RoomTest
    private void CalOffset()
    {
        Vector3 pos = MapUtil.GetMap(m_InitData.m_CurWall).Adjust2Wall(this.transform.position);

        //Debug.LogWarning("calOffset " + pos + " wall=" + m_InitData.m_CurWall + " " + MapUtil.Vector3String(this.transform.position));
        m_Offset = JerryUtil.GetClickPos() - Camera.main.WorldToScreenPoint(pos);
        //第一步,先记录一下位置,不给走
        m_LastDragingPos = JerryUtil.GetClickPos() - m_Offset;
    }
コード例 #8
0
ファイル: CameraCtr.cs プロジェクト: laijingfeng/RoomTest
 private void OnCameraDown(bool usefull)
 {
     this.StopCoroutine("IE_AdjustCamera");
     m_DragUsefull = usefull;
     if (!usefull)
     {
         return;
     }
     m_LastPos = JerryUtil.GetClickPos();
 }
コード例 #9
0
ファイル: UI_Ctr.cs プロジェクト: laijingfeng/RoomTest
    private void DoAdjustPos()
    {
        if (MapUtil.m_SelectFurn == null)
        {
            return;
        }
        Vector3 wordPos   = MapUtil.m_SelectFurn.transform.position;
        Vector3 screenPos = Camera.main.WorldToScreenPoint(wordPos);

        screenPos.z = 0;
        this.transform.localPosition = JerryUtil.PosScreen2Canvas(m_Canvas, screenPos, this.transform);
    }
コード例 #10
0
ファイル: CameraCtr.cs プロジェクト: laijingfeng/RoomTest
 private void JudgeDrag()
 {
     m_Offset = JerryUtil.GetClickPos() - m_LastPos;
     if (Mathf.Abs(m_Offset.x) < 3f)
     {
         return;
     }
     m_LastPos        = JerryUtil.GetClickPos();
     m_LastOffset     = m_Offset;
     m_LastOffsetTime = Time.realtimeSinceStartup;
     DoDrag(-m_Offset.x);
 }
コード例 #11
0
    public static Furniture LoadFurnitureByType(FurnitureType type, Transform parent)
    {
        GameObject obj = Resources.Load <GameObject>("Prefabs/Furnitures/" + type.ToString());
        Furniture  t   = JerryUtil.CloneGo <Furniture>(new JerryUtil.CloneGoData()
        {
            active = true,
            clean  = false,
            parant = parent,
            prefab = obj,
        });

        return(t);
    }
コード例 #12
0
    private void DoClean()
    {
        if (m_Center)
        {
            iTween.Stop(m_ContentRect.gameObject);
            this.StopCoroutine("DoCenter");
        }

        m_ScrollRect.onValueChanged.RemoveListener(OnScrollChange);
        JerryUtil.DestroyAllChildren(m_ContentRect);
        m_Child.Clear();
        m_ScrollRect.enabled = false;
    }
コード例 #13
0
ファイル: Furniture.cs プロジェクト: laijingfeng/RoomTest
 private bool JudgePosOutScreen()
 {
     if (JerryUtil.GetClickPos().x < GameApp.Inst.m_OutScreenJudgeFactor)
     {
         CameraCtr.Inst.DoDrag(-GameApp.Inst.m_OutScreenDragFactor);
         return(true);
     }
     else if (Screen.width - JerryUtil.GetClickPos().x < GameApp.Inst.m_OutScreenJudgeFactor)
     {
         CameraCtr.Inst.DoDrag(GameApp.Inst.m_OutScreenDragFactor);
         return(true);
     }
     return(false);
 }
コード例 #14
0
 private void UpdatePC()
 {
     if (Input.GetMouseButtonDown(0))
     {
         m_TouchStarted  = true;
         m_TouchStartPos = JerryUtil.GetClickPos();
     }
     else if (Input.GetMouseButtonUp(0))
     {
         if (m_TouchStarted)
         {
             Judge();
             m_TouchStarted = false;
         }
     }
 }
コード例 #15
0
ファイル: Click3DCheck.cs プロジェクト: laijingfeng/RoomTest
 /// <summary>
 /// 静态化可以其他地方复用
 /// </summary>
 /// <returns></returns>
 public static RayClickInfo DoRayClick()
 {
     clickInfo.Init();
     ray = Camera.main.ScreenPointToRay(JerryUtil.GetClickPos());
     if (Physics.Raycast(ray, out hitInfo, 100))
     {
         if (hitInfo.collider != null)
         {
             clickInfo.pos       = hitInfo.point;
             clickInfo.col       = hitInfo.collider;
             clickInfo.time      = Time.realtimeSinceStartup;
             clickInfo.screenPos = JerryUtil.GetClickPos();
         }
     }
     return(clickInfo);
 }
コード例 #16
0
        public void DoModify()
        {
            if (Application.isPlaying)
            {
                return;
            }

            TryWork();

            if (config.prefab == null)
            {
                return;
            }

            for (int i = 0; i < editorCreateCnt; i++)
            {
                GameObject go = JerryUtil.CloneGo(new JerryUtil.CloneGoData()
                {
                    name   = i.ToString(),
                    parant = this.transform,
                    prefab = config.prefab.gameObject,
                    active = true,
                });

                switch (config.dir)
                {
                case GridLayoutGroup.Axis.Horizontal:
                {
                    (go.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f);
                    (go.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f);
                }
                break;

                case GridLayoutGroup.Axis.Vertical:
                {
                    (go.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f);
                    (go.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f);
                }
                break;
                }
                (go.transform as RectTransform).pivot     = new Vector2(0, 1);
                (go.transform as RectTransform).sizeDelta = config.cellSize;
                go.transform.localPosition = Idx2LocalPos(i);
            }
        }
コード例 #17
0
    void Awake()
    {
        m_Canvas = this.transform.parent.GetComponent <Canvas>();

        UGUIEventListener.Get(this.gameObject).onDown += (go) =>
        {
            m_LastDownPos = JerryUtil.GetClickPos();
        };

        UGUIEventListener.Get(this.gameObject).onUp += (go) =>
        {
            Vector3 pos = JerryUtil.GetClickPos();
            if ((pos - m_LastDownPos).sqrMagnitude > 0.01f)
            {
                return;
            }
            DoClick();
        };
    }
コード例 #18
0
        private void TryWork()
        {
            if (!awaked ||
                !inited)
            {
                return;
            }

            rectTran = this.transform as RectTransform;
            switch (config.dir)
            {
            case GridLayoutGroup.Axis.Horizontal:
            {
                (rectTran.parent as RectTransform).pivot = new Vector2(0, 0.5f);
                rectTran.anchorMin = new Vector2(0, 0.5f);
                rectTran.anchorMax = new Vector2(0, 0.5f);
                fiexdDirViewCountF = config.dirViewLen / (config.cellSize.x + config.spacing.x);
            }
            break;

            case GridLayoutGroup.Axis.Vertical:
            {
                (rectTran.parent as RectTransform).pivot = new Vector2(0.5f, 1.0f);
                rectTran.anchorMin = new Vector2(0.5f, 1.0f);
                rectTran.anchorMax = new Vector2(0.5f, 1.0f);
                fiexdDirViewCountF = config.dirViewLen / (config.cellSize.y + config.spacing.y);
            }
            break;
            }
            rectTran.pivot = new Vector2(0, 1);

            fiexdDirViewCount = Mathf.CeilToInt(fiexdDirViewCountF);
            config.progress   = Mathf.Clamp01(config.progress);

            itemList.Clear();
            JerryUtil.DestroyAllChildren(this.transform, false);

            curFirstIdx = -1;
            ResetPos();
            ResetDelta();

            ready = true;
        }
コード例 #19
0
    private void AddOneCtr(object[] args)
    {
        if (!m_Inited)
        {
            return;
        }
        if (args == null || args.Length != 1)
        {
            return;
        }
        CtrConfig  ctr     = (CtrConfig)args[0];
        CtrBtnItem ctrItem = JerryUtil.CloneGo <CtrBtnItem>(new JerryUtil.CloneGoData()
        {
            parant = m_Content,
            prefab = m_BtnPrefab.gameObject,
            active = true,
        });

        ctrItem.Init(ctr);
    }
コード例 #20
0
    private void Judge()
    {
        Vector3 start = m_TouchStartPos;
        Vector3 end   = JerryUtil.GetClickPos();

        float dis = Vector2.Distance(start, end);

        if (dis < m_MinSwipeDistancePixels)
        {
            return;
        }

        float angle = Mathf.Rad2Deg * Mathf.Atan2(end.y - start.y, end.x - start.x);

        angle = (360 + angle) % 360;
        int iAngle = (int)((angle + m_PartAngle * 0.5f) % 360);

        //Debug.LogWarning("i:" + iAngle + " " + angle);

        JudgeDir(iAngle / m_PartAngle);
    }
コード例 #21
0
ファイル: SampleItem.cs プロジェクト: laijingfeng/JerryScroll
    private void TryFillData()
    {
        if (!_awaked ||
            !isDataDirty)
        {
            return;
        }
        isDataDirty = false;
        curData     = dataChange.Diff(curData, newData);

        if (dataChange.headChanged)
        {
            JerryUtil.CloneGo(new JerryUtil.CloneGoData()
            {
                active = true,
                clean  = true,
                parant = head,
                prefab = Resources.Load <GameObject>(curData.head),
            });
        }

        id.text  = curData.id.ToString();
        num.text = curData.num.ToString();
    }
コード例 #22
0
 private int GetDataNum()
 {
     return(JerryUtil.String2TArray <int>(dataNum.text)[0]);
 }
コード例 #23
0
    private void TestV()
    {
        layoutSpacing.text = "0";

        layoutV = layoutVContent.gameObject.AddComponent <SampleLayout>();
        RefreshDataNum(0);
        List <SampleItem.ItemData> datas = new List <SampleItem.ItemData>();

        sortData.onClick.AddListener(() =>
        {
            if (datas.Count <= 0)
            {
                return;
            }
            if (sortFlag)
            {
                datas.Sort((x, y) => - x.id.CompareTo(y.id));
            }
            else
            {
                datas.Sort((x, y) => x.id.CompareTo(y.id));
            }
            sortFlag = !sortFlag;
            layoutV.RefreshDatas();
        });

        genData.onClick.AddListener(() =>
        {
            datas = GenDatas(GetDataNum());
            if (!layoutV.Inited)
            {
                layoutV.DoInit(new LayoutConfig()
                {
                    progress     = layoutProgress.value,
                    bufHalfCnt   = 1,
                    cellSize     = new Vector2(190, 190),
                    dir          = GridLayoutGroup.Axis.Vertical,
                    dirViewLen   = 500f,
                    prefab       = prefab.transform,
                    spacing      = new Vector2(JerryUtil.String2TArray <float>(layoutSpacing.text)[0], JerryUtil.String2TArray <float>(layoutSpacing.text)[0]),
                    dirCellWidth = 3,
                    frameWorkCnt = 3,
                }, datas);
            }
            else
            {
                layoutV.RefreshDatas(datas, new ModifyConfig()
                {
                    progress = layoutProgress.value,
                    spacing  = new Vector2(JerryUtil.String2TArray <float>(layoutSpacing.text)[0], JerryUtil.String2TArray <float>(layoutSpacing.text)[0]),
                });
            }
        });

        addData.onClick.AddListener(() =>
        {
            if (GetDataNum() > 100000)
            {
                return;
            }
            RefreshDataNum(GetDataNum() == 0 ? 1 : GetDataNum() * 2);
        });

        minusData.onClick.AddListener(() =>
        {
            RefreshDataNum(GetDataNum() / 2);
        });
    }
コード例 #24
0
ファイル: Flag.cs プロジェクト: laijingfeng/RoomTest
 public void Set2Pos(Vector3 pos)
 {
     this.transform.localPosition = JerryUtil.PosScreen2Canvas(m_Canvas, pos, this.transform);
     m_Img.enabled = true;
     Debug.LogWarning("Flag==========================");
 }
コード例 #25
0
ファイル: Furniture.cs プロジェクト: laijingfeng/RoomTest
    private IEnumerator IE_DoDrag()
    {
        Camera camera = Camera.main;

        if (camera == null)
        {
            yield break;
        }

        CalOffset();

        while (m_InDraging)
        {
            if (Util.Vector3Equal(JerryUtil.GetClickPos() - m_Offset, m_LastDragingPos, 2) &&
                !JudgePosOutScreen())   //移动屏幕的时候,相对位置永远不变,这样物体不会更随
            {
                yield return(new WaitForEndOfFrame());

                yield return(new WaitForEndOfFrame());//等两帧,减小频率

                continue;
            }

            m_LastDragingPos = JerryUtil.GetClickPos() - m_Offset;
            m_Ray            = Camera.main.ScreenPointToRay(m_LastDragingPos);

            if (Physics.Raycast(m_Ray, out m_HitInfo, 100,
                                JerryUtil.MakeLayerMask(JerryUtil.MakeLayerMask(false),
                                                        MapUtil.GetWallLayerNames(m_Config.setType))))
            {
                if (m_HitInfo.collider != null &&
                    m_HitInfo.collider.gameObject != null)
                {
                    RayClickPos fp = new RayClickPos();
                    fp.pos      = m_HitInfo.point;
                    fp.wallType = MapUtil.WallLayer2WallEnum(m_HitInfo.collider.gameObject.layer);

                    //Debug.LogWarning(fp.wallType + " xxx " + m_InitData.m_CurWall);

                    if (fp.wallType != m_InitData.m_CurWall ||
                        !Util.Vector3Equal(fp.pos, m_LastPos))
                    {
                        m_LastPos = fp.pos;

                        if (fp.wallType == m_InitData.m_CurWall)
                        {
                            UI_Ctr.Inst.HideCtr();
                            //Debug.LogWarning("bbbb================ " + MapUtil.Vector3String(fp.pos));
                            if (Place2Pos(fp.pos, true))
                            {
                                CalOffset();
                                //yield break;
                            }
                        }
                        else
                        {
                            if (fp.wallType != Enum_Wall.Floor &&
                                m_Config.setType != MapUtil.SetType.Floor)
                            {
                                //Debug.LogWarning("aaaa================");
                                UI_Ctr.Inst.HideCtr();
                                SelectChange2Wall(m_InitData.m_CurWall, fp.wallType, fp.pos);
                                //yield return new WaitForEndOfFrame();
                                CalOffset();
                                //yield break;
                            }
                        }
                    }
                }
            }

            yield return(new WaitForEndOfFrame());

            yield return(new WaitForEndOfFrame());//等两帧,减小频率
        }

        if (m_Selected)
        {
            UI_Ctr.Inst.ShowCtr();
            //Debug.LogWarning("Click ShowCtr");
        }
    }
コード例 #26
0
        private void RefreshData(bool forceUpdate = false)
        {
            updateWork  = 0;
            updateDirty = false;

            curLastIdx = curFirstIdx + (fiexdDirViewCount + config.bufHalfCnt * 2) * config.dirCellWidth - 1;
            if (curLastIdx >= TotalCount)
            {
                curLastIdx = TotalCount - 1;
            }

            foreach (T item in itemList)
            {
                if (!forceUpdate &&
                    item.GetGridIdx() >= curFirstIdx &&
                    item.GetGridIdx() <= curLastIdx)
                {
                    item.SetGridState(true);
                }
                else
                {
                    item.SetGridState(false);
                }
            }

            for (int i = curFirstIdx; i <= curLastIdx; i++)
            {
                if (!forceUpdate &&
                    itemList.Exists((x) => x.GetGridIdx() == i))
                {
                    continue;
                }

                //还有新的任务
                if (!forceUpdate &&
                    config.frameWorkCnt > 0 &&
                    updateWork > config.frameWorkCnt)
                {
                    updateDirty = true;
                    break;
                }

                tmpLayoutItem = itemList.Find((x) => x.GetGridState() == false);
                if (tmpLayoutItem == null)
                {
                    tmpLayoutItem = JerryUtil.CloneGo <T>(new JerryUtil.CloneGoData()
                    {
                        name   = i.ToString(),
                        parant = this.transform,
                        prefab = config.prefab.gameObject,
                        active = true,
                    });
                    switch (config.dir)
                    {
                    case GridLayoutGroup.Axis.Horizontal:
                    {
                        (tmpLayoutItem.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f);
                        (tmpLayoutItem.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f);
                    }
                    break;

                    case GridLayoutGroup.Axis.Vertical:
                    {
                        (tmpLayoutItem.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f);
                        (tmpLayoutItem.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f);
                    }
                    break;
                    }
                    (tmpLayoutItem.transform as RectTransform).pivot     = new Vector2(0, 1);
                    (tmpLayoutItem.transform as RectTransform).sizeDelta = config.cellSize;
                    itemList.Add(tmpLayoutItem);
                }
                tmpLayoutItem.SetGridState(true);
                tmpLayoutItem.SetGridIdx(i, Idx2LocalPos(i), datas[i]);

                updateWork++;
            }

            if (!updateDirty)
            {
                for (int i = 0, imax = itemList.Count; i < imax; i++)
                {
                    if (itemList[i].GetGridState() == false)
                    {
                        itemList[i].SetGridHide();
                    }
                }
            }
        }
コード例 #27
0
    public override void Init()
    {
        base.Init();

        m_LogContent = this.transform.FindChild("Log/Viewport/Content");
        layout       = m_LogContent.gameObject.AddComponent <LogLayout>();

        m_LogPrefab = this.transform.FindChild("Log/LogPrefab");
        m_LogPrefab.gameObject.SetActive(false);
        m_FilterInput = this.transform.FindChild("BaseCtr/InputField").GetComponent <InputField>();
        m_FilterInput.onEndEdit.AddListener((str) =>
        {
            filterStrs = JerryUtil.String2TArray <string>(str, ';');
            RefreshList();
        });
        m_TypeDropdown = this.transform.FindChild("BaseCtr/TypeDropdown").GetComponent <Dropdown>();
        m_TypeDropdown.options.Clear();
        m_TypeDropdown.options.AddRange(new List <Dropdown.OptionData>()
        {
            new Dropdown.OptionData()
            {
                text = Enum_LogType.All.ToString()
            },
            new Dropdown.OptionData()
            {
                text = Enum_LogType.Inf.ToString()
            },
            new Dropdown.OptionData()
            {
                text = Enum_LogType.War.ToString()
            },
            new Dropdown.OptionData()
            {
                text = Enum_LogType.Err.ToString()
            },
        });
        m_TypeDropdown.onValueChanged.AddListener((val) =>
        {
            filterType = (Enum_LogType)val;
            RefreshList();
        });

        m_TagDropdown = this.transform.FindChild("BaseCtr/TagDropdown").GetComponent <Dropdown>();
        m_TagDropdown.options.Clear();
        m_TagDropdown.options.AddRange(new List <Dropdown.OptionData>()
        {
            new Dropdown.OptionData()
            {
                text = Enum_LogTag.All.ToString()
            },
            new Dropdown.OptionData()
            {
                text = Enum_LogTag.Tag0.ToString()
            },
            new Dropdown.OptionData()
            {
                text = Enum_LogTag.Tag1.ToString()
            },
            new Dropdown.OptionData()
            {
                text = Enum_LogTag.Tag2.ToString()
            },
        });
        m_TagDropdown.onValueChanged.AddListener((val) =>
        {
            filterTag = (Enum_LogTag)val;
            RefreshList();
        });

        JerryDebugUGUI.Inst.AddCtr(new CtrConfig()
        {
            m_Name     = "Clear",
            m_Color    = Color.red,
            m_Callback = (x) =>
            {
                CleanAllLog();
            },
        });

        CleanAllLog();
        JerryEventMgr.AddEvent(Enum_Event.AddLog2Screen.ToString(), AddLog2Screen);
        JerryEventMgr.AddEvent(Enum_Event.Change2Bottom.ToString(), EventChange2Bottom);
    }