Я уже некоторое время работаю над игровым проектом для Windows. Раньше у меня было статическое разрешение 1600 x 900, которое меня вполне устраивало. Но не так много для некоторых из моих бета-тестеров.
Это заставило меня задуматься о независимости разрешения в играх на основе XNA. Я прошел через множество систем виртуального разрешения, которые рисуют все на RenderTarget2D и растягивают это, чтобы соответствовать размеру окна. Но это не работает для меня.
Что я хочу знать, так это то, как я могу рассчитать матрицу проекций, аналогичную тому, что использует Террария. Для тех, кто не знает, как это работает в террарии (во всяком случае, сейчас, я думаю, раньше было по-другому): как только вы измените размер игрового окна, вы увидите больше вещей на экране.
В настоящее время моя проекционная матрица определяется как таковая:
Projection = Matrix.CreateOrthographicOffCenter(-25 * _graphics.Viewport.AspectRatio,
25 * _graphics.Viewport.AspectRatio,
-25, 25,
-1, 1 );
Это работает, когда размер окна изменяется по горизонтали. Я вижу больше вещей сбоку, и все в порядке. Но как только я изменяю размер окна по вертикали, все сжимается.
Есть ли способ вычислить матрицу проекции, чтобы она позволяла мне изменять размер окна как по горизонтали, так и по вертикали?
ИЗМЕНИТЬ:
Я использую класс камеры косвенно. Все находится в координатном пространстве Farseer Physics, и когда что-то рисуется на экране, оно преобразуется с помощью Viewport.Unproject().
РЕШЕНИЕ:
Как указал gareththegeek в разделе комментариев выбранного ответа, моя конкретная проекционная матрица, за которой я был после, формируется следующим образом:
Projection = Matrix.CreateOrthographicOffCenter(-(_graphics.Viewport.Width / 1600f * 44),
(_graphics.Viewport.Width / 1600f * 44),
-(_graphics.Viewport.Height / 900f * 25), (_graphics.Viewport.Height / 900f * 25),
-1, 1);