Пример #1
0
 /// <summary>
 /// 生成开启闭合障碍物区所需的道具
 /// </summary>
 /// <param name="info">闭合区域信息</param>
 /// <param name="availableIndex">要生成的闭合区域信息结构体</param>
 private void CreateCloseAreaTool(CloseAreaInfo info, List <int> availableIndex)
 {
     info.tx = Random.Range(0, info.sx);
     info.ty = Random.Range(0, h);
     for (; !availableIndex.Contains(GetIndex(info.tx, info.ty));)
     {
         info.tx = Random.Range(0, info.sx);
         info.ty = Random.Range(0, h);
     }
     availableIndex.Remove(GetIndex(info.tx, info.ty));
     info.t          = (ToolElement)SetElement(GetIndex(info.tx, info.ty), ElementContent.Tool);
     info.t.toolType = (ToolType)info.doorType;
     if (info.t.isHide == false)
     {
         info.t.ConfirmSprite();
     }
 }
Пример #2
0
 /// <summary>
 /// 生成闭合障碍物区内的奖励物品
 /// </summary>
 /// <param name="info">闭合区域信息</param>
 /// <param name="availableIndex">要生成的闭合区域信息结构体</param>
 private void CreateCloseAreaRewards(CloseAreaInfo info, List <int> availableIndex)
 {
     info.innerCount = info.x * info.y;
     info.goldNum    = Random.Range(1, Random.value < 0.5f ? info.innerCount + 1 : info.innerCount / 2);
     for (int i = 0; i < info.goldNum; i++)
     {
         info.gy = i / info.x;
         info.gx = i - info.gy * info.x;
         info.gx = info.sx + info.gx + 1;
         info.gy = info.sy + info.gy + 1;
         if (availableIndex.Contains(GetIndex(info.gx, info.gy)))
         {
             availableIndex.Remove(GetIndex(info.gx, info.gy));
             info.g          = (GoldElement)SetElement(GetIndex(info.gx, info.gy), ElementContent.Gold);
             info.g.goldType = (GoldType)Random.Range(0, 7);
             if (info.g.isHide == false)
             {
                 info.g.ConfirmSprite();
             }
         }
     }
 }
Пример #3
0
    /// <summary>
    /// 生成闭合区域信息
    /// </summary>
    /// <param name="type">闭合区域类型,0:与边界闭合;1:自闭合</param>
    /// <param name="nowArea">闭合区域索引值</param>
    /// <param name="info">要生成的闭合区域信息结构体</param>
    private void CreateCloseAreaInfo(int type, int nowArea, ref CloseAreaInfo info)
    {
        switch (type)
        {
        case 0:
            info.x        = Random.Range(3, obstacleAreaW - 2);
            info.y        = Random.Range(3, h - 3);
            info.sx       = standAreaW + nowArea * obstacleAreaW + 1;
            info.ex       = info.sx + info.x;
            info.doorType = Random.Range(4, 8);
            break;

        case 1:
            info.x        = Random.Range(3, obstacleAreaW - 2);
            info.y        = Random.Range(3, info.x + 1);
            info.sx       = standAreaW + nowArea * obstacleAreaW + 1;
            info.ex       = info.sx + info.x;
            info.sy       = Random.Range(3, h - info.y - 1);
            info.ey       = info.sy + info.y;
            info.doorType = (int)ElementContent.BigWall;
            break;
        }
    }
Пример #4
0
 /// <summary>
 /// 生成U或L闭合障碍物区域的门
 /// </summary>
 /// <param name="info">闭合区域信息</param>
 /// <param name="availableIndex">要生成的闭合区域信息结构体</param>
 private void CreateULShapeAreaDoor(CloseAreaInfo info, List <int> availableIndex)
 {
     availableIndex.Remove(GetIndex((int)info.doorPos.x, (int)info.doorPos.y)); //移除门位置
     SetElement(GetIndex((int)info.doorPos.x, (int)info.doorPos.y), (ElementContent)info.doorType);
 }
Пример #5
0
    /// <summary>
    /// 生成闭合障碍物区域
    /// </summary>
    /// <param name="nowArea">当前障碍物区域的索引值</param>
    /// <param name="availableIndex">尚未初始化的地图元素的索引值列表</param>
    private void CreateCloseArea(int nowArea, List <int> availableIndex)
    {
        int           shape = Random.Range(0, 2);
        CloseAreaInfo info  = new CloseAreaInfo();

        switch (shape)
        {
        case 0:
            CreateCloseAreaInfo(0, nowArea, ref info);
            int dir = Random.Range(0, 4);
            switch (dir)
            {
            case 0:
                info.doorPos = Random.value < 0.5f ? new Vector2(Random.Range(info.sx + 1, info.ex), info.y) : new Vector2(Random.value < 0.5f ? info.sx : info.ex, Random.Range(info.y, h));
                CreateULShapeAreaDoor(info, availableIndex);         //生成U或L闭合障碍物区域的门
                for (int i = h - 1; i > info.y; i--)
                {
                    if (availableIndex.Contains(GetIndex(info.sx, i)))
                    {
                        availableIndex.Remove(GetIndex(info.sx, i));
                        SetElement(GetIndex(info.sx, i), ElementContent.BigWall);
                    }
                }

                for (int i = info.sx; i > info.ex; i++)
                {
                    if (availableIndex.Contains(GetIndex(i, info.y)))
                    {
                        availableIndex.Remove(GetIndex(i, info.y));
                        SetElement(GetIndex(i, info.y), ElementContent.BigWall);
                    }
                }
                for (int i = h - 1; i >= info.y; i--)
                {
                    if (availableIndex.Contains(GetIndex(info.ex, i)))
                    {
                        availableIndex.Remove(GetIndex(info.ex, i));
                        SetElement(GetIndex(info.ex, i), ElementContent.BigWall);
                    }
                }
                info.sy = info.y;
                info.ey = h - 1;
                info.y  = h - 1 - info.y;
                CreateCloseAreaRewards(info, availableIndex);         //奖励
                break;

            case 1:
                info.doorPos = Random.value < 0.5f ? new Vector2(Random.Range(info.sx + 1, info.ex), info.y) : new Vector2(Random.value < 0.5f ? info.sx : info.ex, Random.Range(0, info.y));
                CreateULShapeAreaDoor(info, availableIndex);
                for (int i = 0; i < info.y; i++)
                {
                    if (availableIndex.Contains(GetIndex(info.sx, i)))
                    {
                        availableIndex.Remove(GetIndex(info.sx, i));
                        SetElement(GetIndex(info.sx, i), ElementContent.BigWall);
                    }
                }
                for (int i = info.sx; i < info.ex; i++)
                {
                    if (availableIndex.Contains(GetIndex(i, info.y)))
                    {
                        availableIndex.Remove(GetIndex(i, info.y));
                        SetElement(GetIndex(i, info.y), ElementContent.BigWall);
                    }
                }
                for (int i = 0; i <= info.y; i++)
                {
                    if (availableIndex.Contains(GetIndex(info.ex, i)))
                    {
                        availableIndex.Remove(GetIndex(info.ex, i));
                        SetElement(GetIndex(info.ex, i), ElementContent.BigWall);
                    }
                }
                info.sy = 0;
                info.ey = info.y;
                CreateCloseAreaRewards(info, availableIndex);
                break;

            case 2:
                info.doorPos = Random.value < 0.5f ? new Vector2(Random.Range(info.sx + 1, info.ex), info.y) : new Vector2(info.sx, Random.Range(info.y, h));
                CreateULShapeAreaDoor(info, availableIndex);
                for (int i = h - 1; i > info.y; i--)
                {
                    if (availableIndex.Contains(GetIndex(info.sx, i)))
                    {
                        availableIndex.Remove(GetIndex(info.sx, i));
                        SetElement(GetIndex(info.sx, i), ElementContent.BigWall);
                    }
                }
                for (int i = info.sx; i < info.ex; i++)
                {
                    if (availableIndex.Contains(GetIndex(i, info.y)))
                    {
                        availableIndex.Remove(GetIndex(i, info.y));
                        SetElement(GetIndex(i, info.y), ElementContent.BigWall);
                    }
                }
                for (int i = 0; i <= info.y; i++)
                {
                    if (availableIndex.Contains(GetIndex(info.ex, i)))
                    {
                        availableIndex.Remove(GetIndex(info.ex, i));
                        SetElement(GetIndex(info.ex, i), ElementContent.BigWall);
                    }
                }
                break;

            case 3:
                info.doorPos = Random.value < 0.5f ? new Vector2(Random.Range(info.sx + 1, info.ex), info.y) : new Vector2(info.sx, Random.Range(0, info.y));
                CreateULShapeAreaDoor(info, availableIndex);
                for (int i = 0; i < info.y; i++)
                {
                    if (availableIndex.Contains(GetIndex(info.sx, i)))
                    {
                        availableIndex.Remove(GetIndex(info.sx, i));
                        SetElement(GetIndex(info.sx, i), ElementContent.BigWall);
                    }
                }
                for (int i = info.sx; i < info.ex; i++)
                {
                    if (availableIndex.Contains(GetIndex(i, info.y)))
                    {
                        availableIndex.Remove(GetIndex(i, info.y));
                        SetElement(GetIndex(i, info.y), ElementContent.BigWall);
                    }
                }
                for (int i = h - 1; i >= info.y; i--)
                {
                    if (availableIndex.Contains(GetIndex(info.ex, i)))
                    {
                        availableIndex.Remove(GetIndex(info.ex, i));
                        SetElement(GetIndex(info.ex, i), ElementContent.BigWall);
                    }
                }
                break;
            }
            CreateCloseAreaTool(info, availableIndex);
            break;

        case 1:
            CreateCloseAreaInfo(1, nowArea, ref info);
            for (int i = info.sx; i <= info.ex; i++)
            {
                if (availableIndex.Contains(GetIndex(i, info.sy)))
                {
                    availableIndex.Remove(GetIndex(i, info.sy));
                    SetElement(GetIndex(i, info.sy), ElementContent.BigWall);
                }
                if (availableIndex.Contains(GetIndex(i, info.ey)))
                {
                    availableIndex.Remove(GetIndex(i, info.ey));
                    SetElement(GetIndex(i, info.ey), ElementContent.BigWall);
                }
            }
            for (int i = info.sy + 1; i < info.ey; i++)
            {
                if (availableIndex.Contains(GetIndex(info.sx, i)))
                {
                    availableIndex.Remove(GetIndex(info.sx, i));
                    SetElement(GetIndex(info.sx, i), ElementContent.BigWall);
                }
                if (availableIndex.Contains(GetIndex(info.ex, i)))
                {
                    availableIndex.Remove(GetIndex(info.ex, i));
                    SetElement(GetIndex(info.ex, i), ElementContent.BigWall);
                }
            }
            CreateCloseAreaTool(info, availableIndex);
            CreateCloseAreaRewards(info, availableIndex);
            break;
        }
    }