2009-03-19 2 views
5

В редакторе уровней, который я сделал для своей игры XNA (редактор тоже в XNA), я разрешаю масштабировать объекты Texture2D.Как изменить размер и сохранить Texture2D в XNA?

Когда пользователь пытается сохранить уровень, я бы хотел изменить размер файла изображения на диске, чтобы он не требовал масштабирования в игре.

Есть ли простой способ создать файл изображения (желательно PNG) из масштабированного объекта Texture2D?

ответ

11

Вы можете масштабировать свои текстуры путем рендеринга к цели рендеринга с нужным размером, а затем сохранять текстуру рендеринга.

Этот простой пример показывает, как вы могли это сделать. Игнорируйте настройку GraphicsDevice, чтобы просто сделать небольшой автономный пример. Интересный бит создает цель рендеринга и рисует масштабированную текстуру. Вы должны повторно использовать цели рендеринга, где сможете (все изображения одного размера могут повторно использовать цель рендеринга).

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

Это самое близкое к тому, что я закончил. Хотя я не использовал импорт kernel32 или GetConsoloWindow, я просто использовал свой GraphicsDevice из своего объекта Game. –

0

Вы пытались Texture2D.Save()?

+0

Это будет работать, если Texture2D был правильного размера, но масштабирование выполняется с помощью вызовов Draw, как я могу создать объект Texture2D, который масштабируется? –

0

Масштабирование изображений, как правило, не несет столько накладных расходов, плюс, вы не захотите загружать в память разные размеры одной и той же текстуры, поскольку это будет пустой тратой.

Конечно, вы могли бы написать игру Zune, а это значит, что я, вероятно, отключился от масштабирования, но, во всяком случае.

Я не думаю, что вы можете сохранить масштабированное изображение непосредственно из XNA, но вы можете использовать класс изображений WinForms Image для загрузки изображения, а затем масштабировать его до размеров в редакторе уровня и сохранять его обратно на диск.

Если ваша текстура не является BMP или PNG, возможно, вам придется использовать команду Texture2D.Save(), чтобы преобразовать ее в формат, который вы можете использовать в классе изображения.

Этот раздел может помочь вам с использованием класса Image. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6fe3d353-0b09-440b-95c9-701efdc9e20a/

+0

Я бы очень хотел избежать масштабирования в игре, чтобы мой код столкновения был прост. –

0

У меня есть такой код, который делает большую/меньшую копию текстуры, но через некоторое время я получаю ошибки. После 30 изменений размера я получаю исключение, а не первый раз.

Кажется, проблема с rendertarget, но я не уверен. Интересно, получите ли вы эти исключения, если вы тоже запустите этот код?

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