예제 #1
0
        /// <summary>
        /// 创建地图
        /// </summary>
        private void CreateMap()
        {
            //地面
            //行
            for (int i = 0; i < m_MapData.Count; i++)
            {
                List <int>  data     = m_MapData[i];
                List <Cell> cellList = new List <Cell>();
                //列
                for (int j = 0; j < data.Count; j++)
                {
                    //Cell 构建方块
                    Vector2    pos = new Vector2(j * ColumnInterval + ColumnInterval / 2f, -(i * RowInterval + RowInterval / 2f));
                    GameObject go  = null;
                    go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Building/Ground", isCache: true);
                    go.transform.position   = pos;
                    go.transform.rotation   = Quaternion.identity;
                    go.transform.localScale = new Vector3(1, 1, 1);
                    Cell cell = go.GetComponent <Cell>();
                    cell.Row    = i;
                    cell.Column = j;
                    cellList.Add(cell);

                    //-------------生成站在方块上的物体--------------//

                    Stander stander = null;

                    //玩家
                    go = null;
                    if (data[j] == 2)
                    {
                        go       = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Role, "Player", isCache: true);
                        stander  = go.GetComponent <Stander>();
                        m_Player = (RoleCtrl)stander;
                    }
                    //传送门
                    if (data[j] == 3)
                    {
                        go        = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Prop/GateWay", isCache: true);
                        m_GateWay = go.GetComponent <Stander>();
                    }

                    //障碍物
                    Obstacles obstacles = null;
                    RevocableObstaclesType revocableObstaclesType = RevocableObstaclesType.Red;
                    RevocableObstacles     ro = null;
                    switch (data[j])
                    {
                    case 1:     //墙
                        string walllName = "";
                        int    r         = Random.Range(0, 2);
                        if (r == 0)
                        {
                            walllName = "Wall01";
                        }
                        else
                        {
                            walllName = "Wall02";
                        }
                        go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Building/" + walllName, isCache: true);
                        break;

                    case 5:     //红色可被解除的障碍物
                        go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Obstacles/RedObstacles", isCache: true);
                        revocableObstaclesType = RevocableObstaclesType.Red;
                        break;

                    case 6:     //蓝色可被解除的障碍物
                        go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Obstacles/BlueObstacles", isCache: true);
                        revocableObstaclesType = RevocableObstaclesType.Blue;
                        break;

                    case 11:    //忽隐忽现
                        go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Obstacles/FlickeringObstacles", isCache: true);
                        break;

                    case 70:    //随着玩家移动轮流隐藏出现的的障碍物
                    case 71:
                        go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Obstacles/StepObstacles", isCache: true);
                        StepObstacles so = go.GetComponent <StepObstacles>();
                        if (data[j] == 70)
                        {
                            so.Init(false);
                        }
                        else
                        {
                            so.Init(true);
                        }
                        break;

                    case 8:    //数字障碍物
                        go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Obstacles/NumberObstacles", isCache: true);
                        break;

                    case 12:    //数字锁障碍物
                        go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Obstacles/NumberLockObstacles", isCache: true);
                        break;
                    }

                    //道具
                    Prop     p        = null;
                    PropType propType = PropType.Key;
                    switch (data[j])
                    {
                    case 4:     //钥匙
                        go       = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Prop/Key", isCache: true);
                        propType = PropType.Key;
                        m_Key    = go.GetComponent <Stander>();
                        break;

                    case 9:    //红色道具
                        go       = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Prop/RedRelieveProp", isCache: true);
                        propType = PropType.RedRelieve;
                        break;

                    case 10:    //蓝色道具
                        go       = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Prop/BlueRelieveProp", isCache: true);
                        propType = PropType.BlueRelieve;
                        break;
                    }
                    //
                    if (go != null)
                    {
                        go.transform.position   = new Vector3(cell.transform.position.x, cell.transform.position.y, -2);
                        go.transform.rotation   = Quaternion.identity;
                        go.transform.localScale = new Vector3(1, 1, 1);

                        p         = go.GetComponent <Prop>();
                        obstacles = go.GetComponent <Obstacles>();

                        stander = go.GetComponent <Stander>();

                        ro = go.GetComponent <RevocableObstacles>();
                    }

                    //障碍物
                    if (obstacles != null)
                    {
                        m_ObstaclesList.Add(obstacles);

                        if (ro != null)
                        {
                            ro.Init(revocableObstaclesType);
                        }
                    }
                    //道具
                    if (p != null)
                    {
                        m_PropList.Add(p);
                        p.Init(propType);
                    }
                    //stander
                    if (stander != null)
                    {
                        stander.RefreshCell(cell);
                        cell.AddRefreshStander(stander);
                    }
                }
                m_MapCell.Add(cellList);
            }
            //站立物
            //行
            for (int i = 0; i < m_MapCell.Count; i++)
            {
                List <Cell> cellList = m_MapCell[i];
                //列
                for (int j = 0; j < cellList.Count; j++)
                {
                    Cell upCell    = null;
                    Cell downCell  = null;
                    Cell rightCell = null;
                    Cell leftCell  = null;

                    Cell cell   = cellList[j];
                    int  row    = i;
                    int  column = j;

                    int nextRow    = -1;
                    int nextColumn = -1;
                    //上
                    nextRow    = row - 1;
                    nextColumn = column;
                    if (CheckRangge(nextRow, nextColumn))
                    {
                        upCell = m_MapCell[nextRow][nextColumn];
                    }
                    //下
                    nextRow    = row + 1;
                    nextColumn = column;
                    if (CheckRangge(nextRow, nextColumn))
                    {
                        downCell = m_MapCell[nextRow][nextColumn];
                    }

                    //左
                    nextRow    = row;
                    nextColumn = column - 1;
                    if (CheckRangge(nextRow, nextColumn))
                    {
                        leftCell = m_MapCell[nextRow][nextColumn];
                    }

                    //右
                    nextRow    = row;
                    nextColumn = column + 1;
                    if (CheckRangge(nextRow, nextColumn))
                    {
                        rightCell = m_MapCell[nextRow][nextColumn];
                    }

                    cell.Init(leftCell, rightCell, upCell, downCell);
                }
            }

            //填充背景
            //向上填充10行 向下填充10行
            for (int i = -5; i < m_MapCell.Count + 5; i++)
            {
                Vector2    p1 = new Vector2(ColumnInterval / 2f, -(i * RowInterval + RowInterval / 2f));
                GameObject g  = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Item, "Building/FillBG", isCache: true);
                g.transform.position   = p1;
                g.transform.rotation   = Quaternion.identity;
                g.transform.localScale = new Vector3(1, 1, 1);
                if (i >= 0 && i < m_MapCell.Count)
                {
                    FillBG fillBg = g.GetComponent <FillBG>();
                    fillBg.ToBottom();
                }
            }
        }
        private void OnPlayerArriveTarget(Cell preCell, Cell targetCell, Stander player)
        {
            player.RefreshCell(targetCell);
            preCell.RemoveRefreshStander(player);
            targetCell.AddRefreshStander(player);
            //是否有钥匙
            if (((RoleCtrl)player).HasKey)
            {
                for (int i = 0; i < targetCell.StanderList.Count; i++)
                {
                    if (targetCell.StanderList[i].StanderType == StanderType.GateWay)
                    {
                        OnWin();
                        return;
                    }
                }
            }
            //StepObstacles(随着玩家移动轮流隐藏出现的的障碍物) 改变状态
            List <Stander> sos = m_ObstaclesList.FindAll(x => ((Obstacles)x).ObstaclesType == ObstaclesType.Step);

            if (sos.Count > 0)
            {
                LFrameWork.Sound.EazySoundManager.PlaySound(m_StepObstaclesSound);
            }
            for (int i = 0; i < sos.Count; i++)
            {
                ((StepObstacles)sos[i]).Change();
            }
            if (!m_NumberLockOpen)
            {
                //判断前方是否是数字障碍物
                Cell c = ((RoleCtrl)m_Player).GetForwardCell();
                if (c != null && c.StanderList.Count > 0)
                {
                    for (int i = 0; i < c.StanderList.Count; i++)
                    {
                        if (c.StanderList[i].StanderType == StanderType.Obstacles && ((Obstacles)c.StanderList[i]).ObstaclesType == ObstaclesType.Number)
                        {
                            if (m_TriggerNumberObstaclesList.Contains((NumberObstacles)c.StanderList[i]))
                            {
                                continue;
                            }
                            m_TriggerNumberObstaclesList.Add((NumberObstacles)c.StanderList[i]);

                            if (m_TriggerNumberObstaclesList.Count >= 3)
                            {
                                //触发成功
                                if (m_NumberTotal == GetNumberTotal())
                                {
                                    for (int j = 0; j < m_TriggerNumberObstaclesList.Count; j++)
                                    {
                                        m_TriggerNumberObstaclesList[j].TriggerSucess();
                                        m_NumberLockOpen = true;
                                        //找到所有的数字锁,让其消失
                                        List <Stander> noos = m_ObstaclesList.FindAll(x => ((Obstacles)x).ObstaclesType == ObstaclesType.NumberLock);
                                        for (int t = 0; t < noos.Count; t++)
                                        {
                                            ((NumberLockObstacles)noos[t]).Hide();
                                        }
                                    }
                                }
                                else//触发失败
                                {
                                    for (int j = 0; j < m_TriggerNumberObstaclesList.Count; j++)
                                    {
                                        m_TriggerNumberObstaclesList[j].TriggerFail();
                                    }
                                    m_TriggerNumberObstaclesList.Clear();
                                }
                            }
                            else
                            {
                                ((NumberObstacles)c.StanderList[i]).Trigger();
                            }
                        }
                    }
                }
            }
        }