using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Content; namespace FaceOff { /// /// Loads and maintains emotion category information /// and face textures for each emotion category. /// class FaceLoader { private const string FACES_DIR = @"Texture\Faces\"; private List categoryNames; /// /// The list of emotion category names /// public static List CategoryNames { get { return _i.categoryNames; } } private List numCategoryFaces; /// /// The list containing the number of faces per emotion category /// public static List NumCategoryFaces { get { return _i.numCategoryFaces; } } private int numCategories; /// /// The total number of emotion categories /// public static int NumCategories { get { return _i.numCategories; } } private ContentManager content; /// /// Singleton instance /// private static FaceLoader _i; /// /// Static constructor /// static FaceLoader() { _i = new FaceLoader(); } /// /// Hidden constructor - prevents outside instantiation /// private FaceLoader() { } /// /// Determines NumCategories and populates CategoryNames and NumCategoryFaces. /// public static void Initialize(ContentManager content) { _i.content = content; string[] categoryDirs = Directory.GetDirectories(content.RootDirectory + FACES_DIR, "*", SearchOption.TopDirectoryOnly); _i.numCategories = categoryDirs.Length; _i.categoryNames = new List(); _i.numCategoryFaces = new List(); foreach (string categoryDir in categoryDirs) { _i.categoryNames.Add(categoryDir.Substring(categoryDir.LastIndexOf(@"\") + 1)); string[] faces = Directory.GetFiles(categoryDir); _i.numCategoryFaces.Add(faces.Length); } } /// /// Loads all face textures into the ContentManager. /// public static void LoadTextures(ContentManager content) { for(int i = 0; i < _i.categoryNames.Count; ++i) { string category = _i.categoryNames[i]; for (int k = 0; k < _i.numCategoryFaces[i]; ++k) content.Load(FACES_DIR + category + @"\" + category + "_" + k); } } /// /// Gets a random Texture2D of the given Categories /// /// /// public static Texture2D GetRandomTexture(int categoryIndex) { int picNum = 1 + Util.Random.Next(_i.numCategoryFaces[categoryIndex]); string categoryName = _i.categoryNames[categoryIndex]; return _i.content.Load(FACES_DIR + categoryName + @"\" + categoryName + "_" + picNum); } } }