Работа с примитивами в XNA

Возможно, я пытаюсь использовать XNA так, как он не был разработан, но мне бы очень хотелось иметь возможность рисовать свои собственные примитивы и сохранять их в виде растрового изображения, текстуры2D или чего-то еще, что будет содержать несколько строк 2d. для меня. Моя цель — запрограммировать игру, в которой текстуры создаются процедурно, а не просто загружаются из менеджера контента.

Если это поможет узнать, я создал класс Shape, который хранит многоугольники, и я, вероятно, мог бы просто сказать spriteBatch рисовать каждую линию, но вместо этого я пытаюсь оптимизировать, сохраняя где-то часто используемые формы.


person Max Kessler    schedule 11.12.2012    source источник


Ответы (1)


Вы можете использовать RenderTarget для вашей задачи. Что-то вроде этого:

// var to store your drawing
Texture2D newShape;

// drawing will be on this target
RenderTarget2D rt = new RenderTarget2D(GraphicsDevice, width, height);
SpriteBatch sb = new SpriteBatch(GraphicsDevice);

// set to render all to render target
GraphicsDevice.SetRenderTarget(rt); 

GraphicsDevice.Clear(Color.Transparent); 

sb.Begin();

// Draw what you want here.

sb.End()

// Return to drawing on "main" buffer
GraphicsDevice.SetRenderTarget(null);

// Save the texture you just drawn
newShape = rt;
person Petr Abdulin    schedule 11.12.2012
comment
Потрясающий! Мне нужно было бы делать это только всякий раз, когда добавляется новая форма, которая никогда не добавлялась раньше. Пока я исследовал это, я натолкнулся на мысль, что часто запускать и останавливать sprite-batch для выполнения подобных вещей было плохой идеей. Я проверю это и поделюсь результатами. - person Max Kessler; 11.12.2012
comment
Пожалуйста, мне будет интересно посмотреть, что вы придумаете - person Josh Siegl; 12.12.2012
comment
Хм. Я не смог заставить это работать. Кажется, что изменение целей рендеринга во время работы пакета спрайтов приводит к очень сумасшедшим результатам. - person Max Kessler; 28.12.2012
comment
@MaxKessler Не могу сказать, что я часто использовал эту технику, но я использовал ее успешно. Однако я не изменил RenderTarget при запуске SpriteBatch, вы должны попытаться разделить создание динамической текстуры и окончательный рендеринг в отдельных пакетных запусках. - person Petr Abdulin; 30.12.2012