Пример #1
0
    public KeyValuePair <Vector2, float>[] route(Vector2 origin, Vector2 destiny)
    {
        List <KeyValuePair <Vector2, float> > ret = new List <KeyValuePair <Vector2, float> > ();

        LineHandler origin_line = null, destiny_line = null;

        foreach (LineHandler handler in lines)
        {
            if (origin_line == null && handler.contains(origin))
            {
                origin_line = handler;
            }

            if (destiny_line == null && handler.contains(destiny))
            {
                destiny_line = handler;
            }

            if (origin_line != null && destiny_line != null)
            {
                break;
            }
        }

        Vector2 closest = Vector2.zero;

        if (origin_line == null)
        {
            closest = closestPoint(PlayerMB.Instance.getPosition());
            foreach (LineHandler handler in lines)
            {
                if (origin_line == null && handler.contains(closest))
                {
                    origin_line = handler;
                    break;
                }
            }
        }

        if (closest != Vector2.zero)
        {
            ret.Add(new KeyValuePair <Vector2, float>(closest, origin_line.getScaleFor(closest)));
        }

        if (origin_line != null && destiny_line != null)
        {
            //######################################################
            // IF ORIGIN_LINE AND DESTINY_LINE ARE THE SAME
            // Return only the destiny point, dont have to go
            // to other node
            //######################################################
            if (origin_line == destiny_line)
            {
                ret.Add(new KeyValuePair <Vector2, float>(destiny, destiny_line.getScaleFor(destiny)));
            }
            else
            {
                List <KeyValuePair <Vector2, float> > tmpRoute = new List <KeyValuePair <Vector2, float> >(reach(origin_line, destiny_line));
                //tmpRoute.Reverse ();
                ret.AddRange(tmpRoute);
                ret.Add(new KeyValuePair <Vector2, float>(destiny, destiny_line.getScaleFor(destiny)));
            }
        }

        return(ret.ToArray());
    }