Я никогда не использовал 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
, иначе спрайт будет снаружи.