示例#1
0
 public void FindInternalConnections(Cluster cluster)
 {
     foreach (Portal portal in cluster.GetPortals()) {
         FindConnections (portal, cluster, false);
     }
 }
示例#2
0
    void FindConnections(Portal portal, Cluster cluster, bool oriented)
    {
        Heap<Tile> queue = new Heap<Tile> (Cluster.size * Cluster.size);
        HashSet<Tile> visited = new HashSet<Tile> ();
        int pcount = cluster.GetPortals ().Count - 1;

        foreach (Tile t in portal.GetPortalTiles()) {
            t.distance = 0;
            queue.Add (t);
        }

        while (queue.size () > 0 && pcount > 0) {
            Tile current = queue.RemoveFirst ();
            visited.Add (current);

            Portal newPortal = current.GetPortal ();
            if (newPortal != null && newPortal != portal) {
                if (!portal.ConnectedTo (newPortal) && current.distance>0) {
                    if (!oriented) {
                        Portal.Connect (portal, newPortal, current.distance);
                    } else {
                        portal.AddNeighbour (newPortal, current.distance);
                    }
                    pcount--;
                }
            }

            foreach (Tile nb in cluster.GetNeighbours(current)) {
                if (nb == null || nb.cost == 255 || visited.Contains (nb))
                    continue;

                nb.distance = current.distance + 1;
                if (!queue.Contains (nb))
                    queue.Add (nb);
            }
        }
    }