2012-10-16 17 views
6

Chcę załadować wszystkie pliki w folderze "Treść/tekstury" do gry za pomocą Content.Load ("filename");Jak załadować wszystkie pliki w folderze za pomocą XNA?

Jednak jestem w stanie „znaleźć” pliki znajdujące się wewnątrz treści w ten sposób (program raczej patrzy na „bin/debug /../ content/tekstur”, ale pojawia się błąd przy próbie załadowania pliki jpg/png w Content.Load:

Jak mogę osiągnąć to, co próbuję zrobić? Chcę załadować wszystkie pliki w folderze wewnątrz zawartości (który folder jest właściwy?) gra, więc nie muszę określać wszystkich pojedynczych tekstur.

Dzięki

Odpowiedz

1

Treść w XNA musi zostać zbudowana przy użyciu potoku treści. Przekształca pliki .png (i tak dalej) w pliki .xnb. Są to przetworzone, binarne pliki treści, które ContentManager mogą ładować do instancji Texture2D w środowisku wykonawczym.

(Zauważ, że można załadować pliki obrazów bezpośrednio z Texture2D.FromStream -. MSDN jednak nie mnożenia lewostronnego alfa, co jest, co domyślne XNA za rendering tryby użyciu.)

Więc przede wszystkim trzeba uzyskać wszystkie treści pliki do kompilacji. Pipeline treści XNA używa MSBuild. Plik projektu w Visual Studio to plik MSBuild. Musisz więc ręcznie edytować plik projektu, aby zbudować zestaw plików za pomocą symbolu wieloznacznego. Są instrukcje w this blog post, które są związane z tym very similar question, o które prosiłem jakiś czas temu.

Wbudowane pliki treści w XNA są po prostu przechowywane w systemie plików, w stosunku do katalogu wyjściowego gry. Tak więc użyj Directory.GetFiles, aby wyliczyć pliki .xnb w katalogu. Następnie skonstruuj ścieżkę do ich załadowania, w odniesieniu do katalogu zawartości (ContentManager.RootDirectory), używając nazwy pliku bez rozszerzenia (które można uzyskać za pomocą Path.GetFileNameWithoutExtension). Następnie po prostu przenieś skonstruowaną ścieżkę do Content.Load<Texture2D>, aby załadować każdy z nich.

(Zauważ, że .xnb pliki mogą zawierać rzeczy inne niż tekstur. Należy więc zadbać, że katalog zawiera tylko tekstur. W przeciwnym razie trzeba złapać wyjątek, który ContentManager.Load<Texture2D> rzuci.)

8

Można użyć tego pomocnika klasa, aby to zrobić. Działa poprzez pobranie katalogu i użycie metody GetFiles() w celu utworzenia listy wszystkich tekstur, które należy załadować. Następnie ładuje je normalnie z Twoim ContentManager i umieszcza je w słowniku, abyś mógł z nich korzystać.

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

      FileInfo[] files = dir.GetFiles("*.*"); 
      foreach (FileInfo file in files) 
      { 
       string key = Path.GetFileNameWithoutExtension(file.Name); 


       result[key] = contentManager.Load<T>(contentFolder + "/" + key); 
      } 
      return result; 
     } 
    } 

Tworzenie słownika do przechowywania tekstur, a nie linia po linii Texture2D s

public Dictionary<string, Texture2D> spriteContent; 

...I wywołać metodę w swojej metodzie

spriteContent = TextureContent.LoadListContent<Texture2D>(content, "textures"); 

LoadContent Teraz kiedy potrzebujesz fakturę od niego, po prostu zrobić:

Whatever.Image = spriteContent["WhateverTexture"] 

Upewnij się TextureName to nazwa atut swojej fakturze.

Powiązane problemy