Beispiel #1
0
    /// <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);
        }
    }
Beispiel #2
0
        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);
                        }
                    }
                }
            }
        }