Переход в полноэкранный режим без растяжения в игре XNA - PullRequest
6 голосов
/ 25 января 2011

У меня есть 2D-игра, над которой я работаю, с соотношением сторон 4: 3.Когда я переключаю его в полноэкранный режим на моем широкоэкранном мониторе, он растягивается.Я попытался использовать два видовых экрана, чтобы создать черный фон, куда игра не должна растягиваться, но это оставило игру того же размера, что и раньше.Я не смог заставить его заполнить область просмотра, которая должна была вместить всю игру.

Как я могу заставить его работать в полноэкранном режиме без растяжения и без необходимости изменять каждую позицию и операторы рисования в игре?Код, который я использую для видовых экранов, приведен ниже.

            // set the viewport to the whole screen
            GraphicsDevice.Viewport = new Viewport
            {
                X = 0,
                Y = 0,
                Width = GraphicsDevice.PresentationParameters.BackBufferWidth,
                Height = GraphicsDevice.PresentationParameters.BackBufferHeight,
                MinDepth = 0,
                MaxDepth = 1
            };

            // clear whole screen to black
            GraphicsDevice.Clear(Color.Black);

            // figure out the largest area that fits in this resolution at the desired aspect ratio
            int width = GraphicsDevice.PresentationParameters.BackBufferWidth;
            int height = (int)(width / targetAspectRatio + .5f);
            if (height > GraphicsDevice.PresentationParameters.BackBufferHeight)
            {
                height = GraphicsDevice.PresentationParameters.BackBufferHeight;
                width = (int)(height * targetAspectRatio + .5f);
            }
            //Console.WriteLine("Back:  Width: {0}, Height: {0}", GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight);
            //Console.WriteLine("Front: Width: {0}, Height: {1}", width, height);

            // set up the new viewport centered in the backbuffer
            GraphicsDevice.Viewport = new Viewport
            {
                X = GraphicsDevice.PresentationParameters.BackBufferWidth / 2 - width / 2,
                Y = GraphicsDevice.PresentationParameters.BackBufferHeight / 2 - height / 2,
                Width = width,
                Height = height,
                MinDepth = 0,
                MaxDepth = 1
            };

            GraphicsDevice.Clear(Color.CornflowerBlue);

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

Not correctly scaling

Ответы [ 4 ]

2 голосов
/ 25 января 2011
0 голосов
/ 26 июня 2012

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

  1. Установите ширину и высоту вашего заднего экрана для разрешения 16: 9.
  2. Запрограммируйте смещение, чтобы объекты не прорисовывались в этих границах.

Дело в том, что в наши дни все основные игры, если вы играете в них на мониторе 16: 9 и выбираете разрешение 4: 3, растягиваются до размера экрана. Это не то, что вы обычно хотите преодолеть. Вы либо поддерживаете много разрешений в своей игре, либо растягиваетесь, если пользователь использует неправильное разрешение для своего типа экрана.

Обычно каждый настраивает свою игру и свои текстуры на работу, основываясь на относительных размерах текущей области просмотра или ширины и высоты заднего буфера. Таким образом, независимо от введенного разрешения, игра масштабируется для работы с этим соотношением ширина / высота.

Это немного больше работы, но, в конце концов, делает вашу игру намного более отточенной и совместимой с широким спектром систем.

Единственный раз, когда это не может быть сделано, это если приложение запускается в окне (НЕ в полноэкранном режиме).

0 голосов
/ 25 января 2011

Прежде всего, я предполагаю, что вы говорите о XNA 4.0, в котором, по словам AFAIK, есть существенные различия между XNA 3.x и XNA 4.0.

Я относительно новичок в XNA, однако мне кажется, что ваши активы не соответствуют размеру окна. Допустим, ваша игра имеет размер 320х240, а ваше окно больше, например 640х480.

Таким образом, вы можете указать PreferredBuffer , чтобы увеличить масштаб вашего приложения. Итак, сообщите XNA, что вы собираетесь использовать 320x240, установив следующие значения:

_graphics.PreferredBackBufferWidth = 320;
_graphics.PreferredBackBufferHeight = 240;

Дополнительно вы можете запустить полноэкранный режим, установив:

_graphics.IsFullScreen = true;

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

Оформить заказ на мой образец в. https://github.com/hmadrigal/xnawp7/tree/master/XNASample02

(Кстати, вы можете нажать F11 для переключения между полноэкранным и обычным режимом просмотра)

С наилучшими пожеланиями, Herber

0 голосов
/ 25 января 2011

Как и в коммерческих играх, вы должны предоставить пользователю опцию, позволяющую ему переключаться между аспектами 4: 3 и 16: 9.Вы должны иметь возможность просто изменить соотношение сторон просмотра камеры.

РЕДАКТИРОВАТЬ:

Насколько я видел, нет игр, которые "автоматически обнаруживают" правильный аспектсоотношение к использованию.

Как уже указывалось, есть способы сделать правильное предположение относительно того, что такое правильное соотношение сторон.Если XNA позволяет вам получить данные о настройках экрана текущего пользователя Windows, вы можете определить соотношение сторон на основе разрешения монитора.

После того, как вы определили разрешение монитора пользователя, вы можете наилучшим образом решить, какиметь дело с этим.Сначала лучше всего поставить черные полосы в левой / правой части экрана, чтобы обеспечить полноэкранный режим с соотношением сторон 16: 9, в котором по-прежнему используется изображение 4: 3.

В конце концов, вы можете изменить игру, чтобы она изменяла размер порта просмотра, когда соотношение сторон составляет 16: 9.Это не потребует изменения каких-либо художественных активов, просто как они отображаются.

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