2012-10-16 56 views
6

Tôi muốn tải tất cả các tệp trong một thư mục "Nội dung/họa tiết" vào trò chơi bằng cách sử dụng Content.Load ("tên tệp");Làm thế nào để tải tất cả các tập tin trong một thư mục với XNA?

Tuy nhiên, tôi không thể "tìm" tệp nằm bên trong Nội dung theo cách này (chương trình thay vì xem "bin/debug /../ Content/textures", nhưng tôi gặp lỗi khi cố tải các tệp jpg/png ở đó có Content.Load

Làm cách nào để có thể đạt được những gì tôi đang cố gắng? Tôi muốn tải tất cả các tệp trong một thư mục bên trong Nội dung (thư mục nội dung nào là đúng?) trò chơi, để tôi không phải chỉ định từng kết cấu.

Cảm ơn.

Trả lời

0

Với XNA, bạn phải chỉ định mỗi và mọi kết cấu, bởi vì bạn muốn chúng có một cái tên độc đáo và dễ dàng. nếu bạn muốn tải một số lượng kết cấu biến đổi từ một thư mục, bạn có thể sử dụng ví dụ này: http://www.csharp-examples.net/get-files-from-directory/

1

Nội dung trong XNA cần được xây dựng với đường dẫn nội dung. Nó biến các tệp .png của bạn (v.v.) thành các tệp .xnb. Đây là các tệp nội dung nhị phân được xử lý mà ContentManager có thể tải vào các trường hợp Texture2D khi chạy.

(Lưu ý rằng bạn có thể tải tập tin hình ảnh trực tiếp với Texture2D.FromStream -. MSDN Tuy nhiên nó không alpha premultiply, đó là những gì chế độ mặc định XNA của render sử dụng.)

Vì vậy, trước hết bạn phải có được tất cả nội dung của bạn tệp để tạo. XNA Content Pipeline sử dụng MSBuild. Tệp dự án trong Visual Studio tệp MSBuild. Vì vậy, những gì bạn cần làm là chỉnh sửa tập tin dự án bằng tay để xây dựng một tập hợp các tập tin bằng cách sử dụng một ký tự đại diện. Có hướng dẫn trong this blog post, được liên kết từ số very similar question mà tôi đã hỏi khá lâu trước đây.

Tệp nội dung được xây dựng trong XNA được lưu trữ đơn giản trong hệ thống tệp, liên quan đến thư mục đầu ra của trò chơi của bạn. Vì vậy, hãy sử dụng Directory.GetFiles để liệt kê thông qua các tệp .xnb trong thư mục. Sau đó, xây dựng một đường dẫn để tải chúng từ, liên quan đến thư mục nội dung (ContentManager.RootDirectory), sử dụng tên tệp của chúng mà không có phần mở rộng (mà bạn có thể nhận được với Path.GetFileNameWithoutExtension). Sau đó, chỉ cần chuyển đường dẫn được xây dựng của bạn đến Content.Load<Texture2D> để tải từng đường.

(Lưu ý rằng .xnb file chứa đựng nhiều thứ khác hơn là kết cấu. Vì vậy, bạn nên chăm sóc mà thư mục của bạn chỉ chứa kết cấu. Nếu không, bạn cần phải nắm bắt những ngoại lệ mà ContentManager.Load<Texture2D> sẽ ném.)

8

Bạn có thể sử dụng helper này lớp để làm điều này. Nó hoạt động bằng cách lấy một thư mục nhất định và sử dụng phương thức GetFiles() để tạo danh sách tất cả các kết cấu cần thiết để nạp. Sau đó tải chúng như bình thường với ContentManager và đặt chúng vào từ điển để bạn có thể sử dụng chúng.

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; 
     } 
    } 

Tạo một từ điển để lưu trữ các kết cấu, chứ không phải là từng dòng Texture2D s

public Dictionary<string, Texture2D> spriteContent; 

...Và gọi phương thức trong LoadContent phương pháp của bạn

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

Bây giờ bất cứ khi nào bạn cần một kết cấu từ nó, chỉ cần làm:

Whatever.Image = spriteContent["WhateverTexture"] 

Hãy chắc chắn rằng TextureName là tên nội dung của kết cấu của bạn.

Các vấn đề liên quan