XNA: изменение размера ортогонального окна без растяжения

Я уже некоторое время работаю над игровым проектом для 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);

person aRkker    schedule 28.04.2013    source источник
comment
Почему бы просто не вызывать фрагмент кода, который у вас есть выше, каждый раз, когда размер окна изменяется?   -  person ClassicThunder    schedule 29.04.2013
comment
Я делаю это в событии Window.ClientSizeChanged, но, как сказано выше, оно работает только при изменении размера окна по горизонтали и ужасно ломается при вертикальном изменении.   -  person aRkker    schedule 29.04.2013


Ответы (1)


Если вы включите разрешение дисплея в орфографическую проекцию, вы можете добиться желаемого эффекта, я думаю.

Projection = Matrix.CreateOrthographicOffCenter(
    0.0f, _graphics.Viewport.Width,
    _graphics.Viewport.Height, 0.0f,
    -1.0f, 1.0f);
person gareththegeek    schedule 29.04.2013
comment
Если я правильно помню, я уже пытался это сделать, но я проверю это снова, как только вернусь домой с работы и сообщу о результатах. - person aRkker; 29.04.2013
comment
Да, действительно, я пробовал это, он отображает весь мой мир, а не только то, что показывает камера. Я собираюсь добавить упоминание об использовании камеры к исходному вопросу. - person aRkker; 29.04.2013
comment
Потому что высота вашей орфографической матрицы не зависит от разрешения экрана. Он жестко закодирован от -25 до +25. Независимо от того, насколько велико окно, вы увидите только те же 50 единиц вертикального пространства. Вы можете попробовать использовать соотношение текущей высоты экрана к желаемой высоте экрана * 25. например. в 1080p у вас будет 1080/900*25 - person gareththegeek; 29.04.2013
comment
Очень хороший! Я не знаю, было ли это именно тем, что вы хотели, но я добавил решение к исходному вопросу. После небольшой тонкой настройки я нашел значения, соответствующие тому, что мне нужно, и теперь оба способа изменения размера окна работают так, как я хотел. Благодарю вас, мой добрый сэр, может быть, сегодня я как следует высплюсь. - person aRkker; 29.04.2013