/// <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(); } }
/// <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(); } } } }
/// <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; } }
/// <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); }
/// <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; } }