Я записал 2D Механизм Jump&Run, приводящий к 320x224 (320x240) изображение. Для поддержания старой школы "pixely" - чувствуют к нему, я хотел бы масштабировать получающееся изображение 2 или 3 или 4, согласно разрешению пользователя.
Я не хочу масштабировать каждый спрайт, но получающееся изображение!
Заранее спасибо :)
Я не совсем понимаю, что вы имеете в виду под "результатом будет ... изображение", но если вы имеете в виду, что конечным результатом будет текстура, то вы можете нарисовать ее на экране и задать масштаб:
spriteBatch.Draw(texture, position, source, color, rotation, origin, scale, effects, depth);
Просто замените масштаб на любое число, которое вам нужно (2, 3 или 4). Я делаю нечто подобное, но масштаб задаю для каждого спрайта, а не для результирующего изображения. Если вы имеете в виду что-то другое, дайте мне знать, и я постараюсь помочь.
XNA по умолчанию сглаживает масштабированное изображение. Если вы хотите сохранить пиксельность, вам нужно рисовать в режиме немедленной сортировки и установить некоторые дополнительные параметры:
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None);
GraphicsDevice.SamplerStates[0].MagFilter = TextureFilter.Point;
GraphicsDevice.SamplerStates[0].MinFilter = TextureFilter.Point;
GraphicsDevice.SamplerStates[0].MipFilter = TextureFilter.Point;
Это либо Point, либо None TextureFilter. Я на работе, поэтому пытаюсь вспомнить на вскидку. Я подтвержу так или иначе позже сегодня.
Ответ Боба правильный об изменении режима фильтрации на TextureFilter.Point
, чтобы все было красиво и пикселизировано.
Но, возможно, лучший метод, чем масштабирование каждого спрайта (так как вам также придется масштабировать положение каждого спрайта), - это просто передать матрицу в SpriteBatch.Begin
, например:
sb.Begin(/* first three parameters */, Matrix.CreateScale(4f));
Это даст вам желаемое масштабирование без необходимости изменять все ваши вызовы рисования.
Однако стоит отметить, что, если вы используете смещения с плавающей запятой в своей игре, вы в конечном итоге получите вещи, не выровненные по границам пикселей после масштабирования (с помощью любого метода).
Для этого есть два решения. Во-первых, иметь функцию, подобную этой:
public static Vector2 Floor(Vector2 v)
{
return new Vector2((float)Math.Floor(v.X), (float)Math.Floor(v.Y));
}
А затем пропускать свою позицию через эту функцию каждый раз, когда вы рисуете спрайт. Хотя это может не сработать, если ваши спрайты используют какое-либо вращение или смещение. И снова вы вернетесь к изменению каждого вызова розыгрыша.
«Правильный» способ сделать это, если вы хотите простую точечную шкалу:вверх всей вашей сцены, чтобы нарисовать вашу сцену до цели рендеринга в исходном размере. А затем нарисуйте целевой объект рендеринга на экране, масштаб которого увеличен (с помощью TextureFilter.Point
).
Функция, на которую вы хотите посмотреть, это GraphicsDevice.SetRenderTarget
. Эту статью MSDN, возможно, стоит прочитать. Если вы используете или переходите на XNA 4.0, это может стоить прочитать.
Я не смог быстро найти более простой пример XNA для этого, но в примере Bloom Postprocess используется целевой объект рендеринга, к которому затем применяется шейдер размытия. Вы можете просто полностью проигнорировать шейдер и просто выполнить масштабирование.