2012-02-19 3 views
2

Как загрузить все объекты изображения в определенную папку в моей XNA-игре? Текстуры расположены в проекте контента, как обычно, но вместо копирования строки после строки для каждой добавляемой новой текстуры можно автоматически загрузить их.Загрузите все Texture2Ds в папку

+0

Можете ли вы объяснить «почему», почему вы хотите это сделать? Чего вы пытаетесь достичь? Ответ, приведенный @icaptan, верен, но, возможно, вы решаете неправильную проблему, если мы понимаем, что именно вы пытаетесь сделать, мы могли бы указать вам в лучшем направлении. –

+0

У меня есть много изображений кнопок для моей игры и вам нужен лучший способ загрузить их, чем делать теги Texture2D и content.loads миллион раз (преувеличение, но смотря на это так) – Cyral

+0

Возможно, вам будет лучше добавить все эти на одно изображение. Это более эффективный способ работы с изображениями и создание намного меньших нагрузок контента. Но если у вас действительно есть тонны изображений, то ответ, приведенный ниже, на @icaptan будет работать нормально. Я лично рекомендовал бы его первый метод. –

ответ

3

В основном существует два способа

первый: Переименование изображения от 1 до N, так что вы можете загружать изображения в цикле, такие как

List<Texture2D> images = new List<Texture2D>(); 
string folderPath = "MyImages/"; 
for(int i= 0; i<Count; i++) 
{ 
    try 
    { 
     images.Add(Content.Load<Texture2D>(folderPath + i.ToString)); 
    } 
    catch 
    { 
     break; 
    } 
} 

код выше работ для конкретного счета, вы можете изменить для итерации пока (true) приращение i, ловушка catch сломается, если больше нет изображений.

или использовать это (поместите статический класс в пространство имен вашего игрового проекта, а не под любую папку подпространства имен), это сработает. если вы не хотите, чтобы расширить содержание, чем удалить «это» из функции)

public static class MyExtension 
{ 
     public static List<T> LoadListContent<T>(this ContentManager contentManager, string contentFolder) 
     { 
      DirectoryInfo dir = new DirectoryInfo(contentManager.RootDirectory + "/" + contentFolder); 
      if (!dir.Exists) 
       throw new DirectoryNotFoundException(); 
      List<T> result = new List<T>(); 

      FileInfo[] files = dir.GetFiles("*.*"); 
      foreach (FileInfo file in files) 
      { 
       result.Add(contentManager.Load<T>(contentFolder + "/" + file.Name.Split('.')[0])); 
      } 
      return result; 
     } 
} 

Этот код имеет проблему, если длина вашего реальный путь будет больше, чем 256, то функция не будет работать. Так что будь осторожен.

+0

Ваш второй пример - это почти то, как я пытался это сделать (но не удалось). Благодарю. Но (глупый вопрос), куда я должен поместить этот код? – Cyral

+0

Я бы предположил, что вы поместили его в метод LoadContent любого класса, требующего этих изображений. –

+0

Вы не можете вставить его в метод loadcontent(). Если я переименую это в loadcontent, он просто говорит: «Метод расширения должен быть определен в неэквивалентном статическом классе» – Cyral

Смежные вопросы