Почтовый ящик и масштабирование в XNA на ПК - PullRequest
1 голос
/ 16 августа 2010

Есть ли способ, которым я мог бы в основном разработать свою игру XNA с разрешением 1080p (или 720p) в качестве разрешения по умолчанию, а затем, в зависимости от установленного разрешения, просто масштабировать все в игре до нужного размера без необходимости устанавливать коэффициент масштабированияв каждом методе Sprite Draw ()?

Я думаю, что я мог бы разработать всю графику, настроить координаты и т. д. на основе разрешения 1080p, но затем для XBOX просто установите разрешение в 720p и уменьшите масштаб(так что XBOX видит все как в разрешении 720 и, следовательно, обрабатывает все разрешения, как указано в документации для разработчиков) и в масштабе ПК до любого необходимого разрешения или соотношения сторон, автоматически формируя представление для разрешений, отличных от 16: 9.

Я уже настроил игру так, чтобы spritebatch.begin () и end () были вызваны на самом высоком уровне, вокруг всех других вызовов Draw, так что я мог технически просто передать туда матрицу масштабирования, но всякий раз, когдаЯ делаю, что это будет делать что-то странное, например, сделать представление оff center или занимает только четверть экрана.

Есть ли лучший способ для достижения этой цели?

1 Ответ

4 голосов
/ 17 августа 2010

Если вы установите матрицу масштабирования в SpriteBatch.Begin, то она будет масштабировать размеры и позиции каждого спрайта, который вы рисуете, с этим SpriteBatch до тех пор, пока вы не вызовете End.

SpriteBatch использует пространство клиента, где ноль - верхний левый угол Viewport, а одна единица в этом пространстве эквивалентна одному пикселю в области просмотра.

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

Например:

Ваша играразработан на 720p, и вы используете SpriteBatch без преобразования.У вас есть спрайт по центру в правом нижнем углу.Скажем, его текстура (32, 32) пикселей, а спрайт origin равен (16, 16) (источник указан в текстурном пространстве, так что это центр спрайта).У спрайта position есть (1280, 720).Спрайт scale равен 1, что дает его итоговый размер (32, 32).Вы увидите верхнюю левую четверть спрайта в правом нижнем углу экрана.

Теперь вы переходите к экрану с разрешением 1080p (в 1,5 раза больше, чем 720p).Если вы не добавляете масштабирующую матрицу к SpriteBatch, вы можете увидеть весь спрайт с его двумя третями экрана, вправо и вниз.

Но вы хотитемасштабировать всю сцену так, чтобы в 1080p она выглядела так же, как в 720p.Таким образом, вы добавляете матрицу Matrix.CreateScale(1.5f, 1.5f, 1f) (обратите внимание, что для оси Z используется 1, потому что это 2D, а не 3D) к вашему SpriteBatch.Begin и ничего не делаете .

Теперь ваша сценаспрайты будут масштабироваться в 1,5 раза больше.Без каких-либо изменений в реальном вызове Draw ваш спрайт будет отображен в позиции (1920, 1080) (нижний правый угол экрана), его размер будет (48, 48) (в 1,5 раза больше), иего происхождение все еще будет центром.Вы увидите верхний левый квадрант спрайта в правом нижнем углу экрана, точно так же, как в 720p и в том же относительном размере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...