Почтовый ящик и масштабирование в XNA на ПК
Есть ли способ, которым я мог бы в основном разработать свою игру XNA с разрешением 1080p (или 720p) в качестве разрешения по умолчанию, а затем, в зависимости от установленного разрешения, просто масштабировать все в игре до нужного размера без необходимости устанавливать коэффициент масштабирования в каждом Sprite Метод Draw()?
Я думал, что я мог бы разработать всю графику, настроить координаты и т. Д. На основе разрешения 1080p, но затем для XBOX просто установите разрешение в 720p и уменьшите масштаб (чтобы XBOX видел все как на 720 и, следовательно, обрабатывал все разрешения, указанные в документах для разработчиков) и в масштабе ПК до любого необходимого разрешения или соотношения сторон, автоматически помечая представление для разрешений, отличных от 16:9.
Я уже настроил игру так, чтобы spritebatch.begin() и end() были вызваны на самом высоком уровне, вокруг всех других вызовов Draw, чтобы я мог технически просто передать туда матрицу масштабирования, но всякий раз, когда я это делал, будет делать что-то странное, например, делать смещение от центра или занимать только четверть экрана.
Есть ли лучший способ для достижения этой цели?
1 ответ
Если вы установите масштабную матрицу в SpriteBatch.Begin
тогда он будет масштабировать размеры и позиции каждого спрайта, который вы рисуете, с этим SpriteBatch
до звонка End
,
SpriteBatch
использует пространство клиента, где ноль - верхний левый угол Viewport
и одна единица в этом пространстве эквивалентна одному пикселю в области просмотра.
Когда вы даете SpriteBatch
трансформация, спрайты, которые вы рисуете, будут применены к ним для вас, прежде чем они будут нарисованы. Таким образом, вы можете (и должны) использовать эту же технику для перевода вашей сцены (например, для центрирования на плеере).
Например:
Ваша игра разработана на 720p, и вы используете SpriteBatch
без трансформации. У вас есть спрайт по центру в правом нижнем углу. Скажем, его текстура (32, 32) пикселей и спрайт origin
is (16, 16) (источник указан в текстурном пространстве, так что это центр спрайта). Спрайта position
есть (1280, 720). Спрайта scale
равен 1, что делает его результирующий размер (32, 32). Вы увидите верхнюю левую четверть спрайта в правом нижнем углу экрана.
Теперь вы переходите на экран с разрешением 1080p (в 1,5 раза больше, чем 720p). Если вы не добавляете масштабирующую матрицу к SpriteBatch
, вы можете увидеть весь спрайт, с его двумя третями экрана, вправо и вниз.
Но вы хотите увеличить масштаб всей сцены так, чтобы в 1080p она выглядела так же, как в 720p. Таким образом, вы добавляете матрицу Matrix.CreateScale(1.5f, 1.5f, 1f)
(обратите внимание, используя 1 для оси Z, потому что это 2D, а не 3D) к вашему SpriteBatch.Begin
и больше ничего не делать.
Теперь ваша сцена спрайтов будет увеличена в 1,5 раза. Без каких-либо изменений в фактическом Draw
вызовите, ваш спрайт будет нарисован в позиции (1920, 1080) (нижний правый угол экрана), его размер будет (48, 48) (в 1,5 раза больше), а его источник по-прежнему будет центром. Вы увидите верхний левый квадрант спрайта в правом нижнем углу экрана, точно так же, как вы это сделали в 720p и в том же относительном размере.