/// <summary> /// Kokoaa reitin useammasta ruutukentän symbolista. /// /// Määrittää, että tietyn ruutukentän symbolin (<c>tileSymbol</c>) kohdalla /// kutsutaan aliohjelmaa <c>f</c>. Huom! Käytä tämän aliohjelman kanssa metodia /// Execute. /// </summary> /// <param name="f">Aliohjelma, muotoa void LuoReittiolio(List<Vector> reitti, double leveys, double korkeus)</param> /// <param name="tileSymbols">Ruutukentän symbolit tiedostossa joista reitti muodostuu</param> public void SetRouteMethod(RouteMethod f, params TileType[] tileSymbols) { if (tileSymbols == null || tileSymbols.Length < 1) { throw new ArgumentException("Pass at least one tile symbol!"); } Vector[] vectorTable = new Vector[tileSymbols.Length]; int vectorsAdded = 0; for (int i = 0; i < tileSymbols.Length; i++) { int index = i; legend[tileSymbols[i]] = delegate(Vector p, double w, double h) { vectorTable[index] = p; if (++vectorsAdded >= tileSymbols.Length) { f(vectorTable.ToList(), w, h); } }; } }
/// <summary> /// Luo kuvion annetusta kuvasta. Kuvassa tulee olla vain yksi /// yhtenäinen muoto (toisin sanoen kuvio ei voi koostua monesta osasta). /// </summary> /// <remarks> /// Kuvion luominen voi olla melko hidasta. Kannattaa luoda kuvio heti pelin alussa /// ja käyttää kerran luotua kuviota kaikille olioille. /// </remarks> /// <param name="image">Kuva, josta muoto luetaan.</param> public static Shape FromImage(Image image) { List <Vector> vertices = TextureToShapeConverter.DetectVertices(image.GetDataUInt().Cast <uint>().ToArray(), image.Width); for (int i = 0; i < vertices.Count; i++) { // Nämä voisi yhdistää, mutta pidetään erillisenä luettavuuden takia. vertices[i] = new Vector(vertices[i].X / image.Width, vertices[i].Y / image.Height); vertices[i] -= new Vector((float)0.5, (float)0.5); vertices[i] = new Vector(vertices[i].X, -vertices[i].Y); // Muoto tulee muuten ylösalaisin } Vector[] polygonVertices = new Vector[vertices.Count]; for (int i = 0; i < vertices.Count; i++) { polygonVertices[i] = new Vector(vertices[i].X, vertices[i].Y); } try { List <List <Vector> > verts = PolygonManipulation.CDTDecomposer.ConvexPartition(polygonVertices.ToList()); List <IndexTriangle> indices = FormIndices(verts, polygonVertices); ShapeCache cache = new ShapeCache(polygonVertices, indices.ToArray(), Array.ConvertAll(Enumerable.Range(0, vertices.Count).ToArray(), v => (short)v)); return(new Polygon(cache)); } catch (Exception e) { Debug.WriteLine("Kuvasta muodostettua muotoa ei voity täyttää kolmioilla jostain syystä."); Debug.WriteLine("Muotoa ei voida piirtää täytettynä värillä."); Debug.WriteLine(e.Message); ShapeCache cache = new ShapeCache(polygonVertices); return(new Polygon(cache)); } }