Разработка игр: Как сделать мою игру-спрайт динамичной для разрешений? - PullRequest
1 голос
/ 24 ноября 2010

Я пишу игру XNA. Но я хочу разумный способ сделать игру динамичной для разных разрешений. Для людей, которые знают Мир Гуу: точно так же, как Мир Гуу. Таким образом, количество видимой области должно быть независимым от разрешения. Итак, если я установлю более высокое разрешение. Я не хочу видеть больше. Я только хочу больше деталей. Конечно, у спрайтов есть детали.

Краткий пример: у меня есть спрайт 64x64. Когда мое разрешение:

  • 720p: я хочу нарисовать его размером (например!) 42x42.
  • 1080p: он должен быть нарисован с размером 64x64. (Таким образом, 1080p означает полный размер спрайта)
  • 480p: он должен быть нарисован с размером 32x32.

Итак, каждый спрайт должен выглядеть одинаково на экране, независимо от разрешения.

Но я не знаю, как это сделать.
Любая помощь?

Ответы [ 2 ]

3 голосов
/ 24 ноября 2010

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

Это означает, что вы можете сохранить положение объекта с абсолютными координатами (например, в диапазоне 0.0f - 1.0), так что x = 0.0 - самый левый видимый пиксель, а 1.0 - самая правая, та же история для координаты y.

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

Например, если у вас 1080p, то вы выбираете спрайты 64x64, 1080/64 дает 16,875, поэтому для разрешения 720p вам потребуется 42,6 пикселя (как вы выбрали: 42x42) и т. Д. Для других разрешений.

Преобразование тогда довольно просто:

float xcord = ...
float ycord = ...

int xscreen = (int)(xcord*xresolution)
int yscreen = (int)(ycord*yresolution)

(я не знаю, использует ли XNA уже поплавки для координат)

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

float xcord = 15.4 /* something absolute to the world*/
int xscreen = (int)((xcord - xviewport_offset) * xresolution)

, где xviewport_offset должна быть координата левой стороны порта просмотра, конечно, разница должна быть < 1.0, иначе спрайт будет снаружи.

1 голос
/ 25 ноября 2010

При использовании SpriteBatch передайте матрицу масштабирования (Matrix.CreateScale) в SpriteBatch.Begin.

Не забудьте учесть соотношение сторон ( этот вопрос , возможно, стоит прочитать).

Вы можете комбинировать матрицы масштабирования и преобразования для обработки прокрутки и т. Д.

Возможно, вы захотите прочитать мои ответы по этой теме здесь (включая ссылки в этом ответе на ответы, в которых рассказывается о том, как работают пространства мира / вида / проекта) и здесь и возможно здесь и здесь .

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