/// <summary> /// Add an edge to the graph and spawn a door. /// </summary> /// <param name="from">One of the room's id</param> /// <param name="to">The other room's id</param> /// <param name="isHorizontal"> Whether th connection between rooms is horizontal or not</param> public void AddEdge(int from, int to, bool isHorizontal) { if (from > to) { AddEdge(to, from, isHorizontal); } else { var spawnInfos = _levelSpawnParameters.roomSpawnInfos; var fromInfo = spawnInfos.Find(info => info.ID == from); var toInfo = spawnInfos.Find(info => info.ID == to); var fromRoom = _levelGraphState.graph.nodes.Find(node => node.ID == from); var toRoom = _levelGraphState.graph.nodes.Find(node => node.ID == to); float x = (toInfo.X + fromInfo.X) / 2f; float y = (toInfo.Y + fromInfo.Y) / 2f; DoorSpawnParameters parameters = new DoorSpawnParameters(x, y, isHorizontal); EdgeStruct edge = new EdgeStruct { from = from, to = to, facade = _doorFactory.Create(parameters) }; _edgesByRooms[from].Add(edge); } }
public void Execute() { for (int i = 0; i < nodes.Length; i++) { for (int j = 0; j < nodes.Length; j++) { var startNode = nodes[i]; var endNode = nodes[j]; if (startNode.id != endNode.id) { var edged = false; var startPoint = float2.zero; var endPoint = float2.zero; var jumpAngle = DEFAULT_ANGLE; //Конечная нода справа от начальной, нет пересечения по x if (endNode.start.x >= startNode.end.x) { if (math.distance(startNode.end, endNode.start) <= jumpRadius) { startPoint = ApplyPadding(startNode.end, startNode.start); endPoint = ApplyPadding(endNode.start, endNode.end); edged = true; } } //Конечная нода слева от начальной, нет пересечения по x else if (endNode.end.x <= startNode.start.x) { if (math.distance(startNode.start, endNode.end) <= jumpRadius) { startPoint = ApplyPadding(startNode.start, startNode.end); endPoint = ApplyPadding(endNode.end, endNode.start); edged = true; } } else if (endNode.start.x < startNode.end.x && endNode.start.x > startNode.start.x) { //Конечная нода справа от начальной, есть пересечение по x, конечная нода выше if (endNode.start.y > startNode.end.y) { startPoint = MathHelper.GetClosestPoint(startNode.start, startNode.end, endNode.start); startPoint = ApplyPadding(startPoint, startNode.start, 2); endPoint = ApplyPadding(endNode.start, endNode.end); edged = true; } //Конечная нода справа от начальной, есть пересечение по x, конечная нода ниже else { startPoint = ApplyPadding(startNode.end, startNode.start, 0.5f); endPoint = MathHelper.GetClosestPoint(endNode.start, endNode.end, startNode.end); endPoint = ApplyPadding(endPoint, endNode.end); edged = true; } } else if (endNode.end.x > startNode.start.x && endNode.end.x < startNode.end.x) { //Конечная нода слева от начальной, есть пересечение по x, конечная нода выше if (endNode.start.y > startNode.end.y) { startPoint = MathHelper.GetClosestPoint(startNode.start, startNode.end, endNode.end); startPoint = ApplyPadding(startPoint, startNode.end, 2); endPoint = ApplyPadding(endNode.end, endNode.start); edged = true; } //Конечная нода слева от начальной, есть пересечение по x, конечная нода ниже else { startPoint = ApplyPadding(startNode.start, startNode.end, 0.5f); endPoint = MathHelper.GetClosestPoint(endNode.start, endNode.end, startNode.start); endPoint = ApplyPadding(endPoint, endNode.start); edged = true; } } if (edged) { //Если надо прыгнуть вверх, то корректируем угол прыжка if (endPoint.y > startPoint.y) { jumpAngle = GetJumpAngle(startPoint, endPoint); } var edge = new EdgeStruct(); edge.start = startPoint; edge.end = endPoint; edge.nodeId = endNode.id; edge.jumpAngle = jumpAngle; map.Add(startNode.id, edge); } } } } }