Ответ Боба является правильным при изменении режима фильтрации на 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 образец использует цель рендеринга, к которой затем применяет шейдер размытия.Вы можете просто полностью игнорировать шейдер и просто увеличивать масштаб.