2009-03-19 36 views
5

Trong trình chỉnh sửa cấp tôi đã thực hiện cho trò chơi XNA của mình (trình chỉnh sửa cũng nằm trong XNA), tôi cho phép chia tỷ lệ đối tượng Texture2D.Làm thế nào để thay đổi kích thước và lưu một Texture2D trong XNA?

Khi người dùng cố gắng lưu cấp, tôi muốn thực sự thay đổi kích thước tệp hình ảnh trên đĩa sao cho nó không yêu cầu mở rộng quy mô trong trò chơi.

Có cách nào dễ dàng để tạo tệp hình ảnh (ưa thích PNG) từ đối tượng Texture2D được thu nhỏ không?

Trả lời

11

Bạn có thể chia tỷ lệ kết cấu của mình bằng cách hiển thị cho mục tiêu hiển thị ở kích thước bạn muốn và sau đó lưu kết cấu mục tiêu hiển thị.

Ví dụ đơn giản này cho thấy cách bạn có thể thực hiện điều đó. Bỏ qua các thiết lập của GraphicsDevice, đó là chỉ để làm một ví dụ nhỏ khép kín. Bit thú vị là tạo ra các mục tiêu render và vẽ kết cấu thu nhỏ. Bạn nên sử dụng lại các mục tiêu hiển thị nơi bạn có thể (tất cả các hình ảnh có cùng kích thước có thể sử dụng lại mục tiêu hiển thị).

using System; 
using System.Runtime.InteropServices; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 

class Program 
{ 
    [DllImport("kernel32.dll", SetLastError = true)] 
    private static extern IntPtr GetConsoleWindow(); 

    static void Main(string[] args) 
    { 
     string sourceImagePath = args[0]; 
     string destinationImagePath = args[1]; 
     int desiredWidth = int.Parse(args[2]); 
     int desiredHeight = int.Parse(args[3]); 

     GraphicsDevice graphicsDevice = new GraphicsDevice(
      GraphicsAdapter.DefaultAdapter, 
      DeviceType.Hardware, 
      GetConsoleWindow(), 
      new PresentationParameters()); 
     SpriteBatch batch = new SpriteBatch(graphicsDevice); 

     Texture2D sourceImage = Texture2D.FromFile(
      graphicsDevice, sourceImagePath); 

     RenderTarget2D renderTarget = new RenderTarget2D(
      graphicsDevice, 
      desiredWidth, desiredHeight, 1, 
      SurfaceFormat.Color); 

     Rectangle destinationRectangle = new Rectangle(
      0, 0, desiredWidth, desiredHeight); 

     graphicsDevice.SetRenderTarget(0, renderTarget); 

     batch.Begin(); 
     batch.Draw(sourceImage, destinationRectangle, Color.White); 
     batch.End(); 

     graphicsDevice.SetRenderTarget(0, null); 

     Texture2D scaledImage = renderTarget.GetTexture(); 
     scaledImage.Save(destinationImagePath, ImageFileFormat.Png); 
    } 
} 
+2

Đây là điều gần nhất với những gì tôi đã kết thúc khi triển khai. Mặc dù tôi không sử dụng nhập kernel32 hoặc GetConsoloWindow, tôi chỉ đơn giản sử dụng GraphicsDevice từ đối tượng Game của mình. –

0

Bạn đã thử Texture2D.Save() chưa?

+0

Điều này sẽ hoạt động nếu Texture2D có kích thước chính xác nhưng việc chia tỷ lệ được thực hiện bằng lệnh Draw, làm cách nào để tạo đối tượng Texture2D được chia tỷ lệ? –

0

Chia tỷ lệ hình ảnh thường không phải chịu nhiều chi phí trên đầu, cộng với, bạn sẽ không muốn tải các kích thước khác nhau của cùng một kết cấu vào bộ nhớ vì đó sẽ là một sự lãng phí.

Tất nhiên, bạn có thể đang viết một trò chơi Zune, điều đó có nghĩa là tôi có thể không liên quan đến việc chia tỷ lệ ở đó, nhưng, dù sao đi nữa.

Tôi không nghĩ rằng bạn có thể lưu hình ảnh được chia tỷ lệ trực tiếp từ XNA, nhưng bạn có thể sử dụng lớp hình ảnh WinForms để tải hình ảnh và sau đó mở rộng nó đến kích thước trong trình chỉnh sửa cấp và lưu nó ra đĩa.

Nếu kết cấu của bạn không phải là BMP hoặc PNG, bạn có thể phải sử dụng lệnh Texture2D.Save() để chuyển đổi thành định dạng bạn có thể sử dụng trong lớp Hình ảnh.

Chuỗi này có thể giúp bạn sử dụng lớp Hình ảnh. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6fe3d353-0b09-440b-95c9-701efdc9e20a/

+0

Tôi thực sự muốn tránh tăng tỷ lệ trong trò chơi để giữ mã va chạm của tôi đơn giản. –

0

Tôi có mã như thế này tạo bản sao lớn hơn/nhỏ hơn nhưng tôi gặp lỗi sau một thời gian. Sau 30 thay đổi kích thước, sau đó tôi nhận được ngoại lệ, không phải là lần đầu tiên.

Có vẻ là một vấn đề về đích nhưng tôi không chắc chắn. Tự hỏi nếu bạn sẽ nhận được những ngoại lệ này quá nếu bạn chạy mã này quá nhiều?

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