Позиции спрайтов Xna и область просмотра

Я новичок в XNA и играю с пакетом спрайтов. В моей голове есть проблема, которую я не могу решить.

У меня есть класс под названием Sprite. Этот спрайт получил Vector2, который хранит положение спрайта внутри экрана. Я рисую спрайт с помощью Spritebatch с таким вызовом:

spriteBatch.Draw(this.texture, this.position, Color.White);

Представьте, что я создаю сцену или экран с координатами этого типа. Может быть, внизу моей сцены должен быть пол. Когда я помещаю его в фиксированное положение, и кто-то воспроизводит его с большим разрешением, пол не будет внизу моей сцены.

Есть ли способ работать внутри определенного пространства, не зависящего от ширины и высоты ViewPort?

Я прочитал здесь несколько статей. Единственное решение - сначала выполнить рендеринг в RenderTarget, а затем масштабировать его и отобразить в области просмотра?

Надеюсь, ты поможешь мне и уберешь меня от сумасшествия :)!

Спасибо.


person user2421241    schedule 26.05.2013    source источник


Ответы (1)


Не существует предопределенного способа растянуть область просмотра, чтобы она аккуратно вписывалась в экран и чтобы все ваши спрайты выглядели так же, как они, по порядку. Рендеринг в цель рендеринга - хороший способ масштабирования, хотя может быть немного сложным. Особенно, если вы попадете в эффекты постобработки.

Чтобы масштабировать вашу игру, нам нужно сделать несколько вещей. Сначала вам нужно выбрать разрешение по умолчанию, например 800x600. Сделайте свою игру полноценной и работайте в таком разрешении, как это.

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

Сначала получите ширину и высоту области просмотра

float width = GraphicsDevice.Viewport.Width;
float height = GraphicsDevice.Viewport.Height;

Теперь найдите множитель масштаба:

float xScale = width / 800.0f;
float yScale = height / 600.0f;

Значения шкалы должны быть плавающими или двойными, и обязательно, чтобы ваши константы из вашего разрешения по умолчанию также были плавающими или двойными. Если их нет, то при выполнении вычислений десятичные разряды будут опущены. Оставить нам округленное целое число, которое неточно и приведет к неправильному масштабированию.

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

Допустим, ваша позиция спрайта была

pos.x = 400;
pos.y = 240;

теперь это станет

pos.x = 400 * xScale;
pos.y = 240 * yScale;

Теперь это означает, что мы немного изменим способ рисования спрайта.

spritebatch.Draw(this.texture, new Rectangle(this.position.x, this.position.y, this.texture.Width * xScale, this.texture.Height * yScale), Color.white);

Здесь мы рисуем спрайт в его масштабированной позиции и масштабируем его размер в зависимости от размера текстуры, которую мы пытаемся нарисовать.

Примечание. при масштабировании с помощью этого метода все ваши размеры и положение для столкновения также должны быть масштабированы, чтобы это работало.

person Andrew Cumming    schedule 27.05.2013