Как масштабировать texture2d в XNA с изменением размера окна - PullRequest
1 голос
/ 02 марта 2011

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

Наш проект разработан с разрешением 1440 x 900, поэтому я сделал свои собственные изображения, соответствующие этому разрешению экрана. Когда нам нужно продемонстрировать наш проект в классе, проектор может рендерить только до 1024 x 768, поэтому многие вещи на экране пропадают. Я добавил возможности изменения размера окна, и я делаю масштабирование следующим образом. У меня есть свой собственный класс, называемый «кнопка», который имеет текстуру 2d и положение Vector2, сжимаемое кнопкой (Texture2d img, ширина поплавка, высота поплавка).

Моя идея состоит в том, чтобы установить положение изображения в масштабируемом% от ширины и высоты окна, поэтому я пытаюсь установить положение изображения в диапазоне от 0 до 1, а затем умножить на ширину окна. и высота, чтобы все масштабировалось правильно.

(этот код не является правильным синтаксисом, я просто пытаюсь передать смысл)

Button button = new Button(texture, .01, .01 );
int height = graphicsdevice.viewport.height * button.position.Y;
int width = graphicsdevice.viewport.width * button.position.X;

Rectangle rect = new Rectangle(0,0,width, height);

sprite.being()
sprite.draw (button.img, rect, color.white);
sprite.end

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

Каков наилучший способ разработки моей программы с учетом динамического масштабирования texture2d?

1 Ответ

0 голосов
/ 03 марта 2011

Как сказал Ханнеш, если вы запустите его в полноэкранном режиме, у вас не будет этих проблем.Однако у вас также есть фундаментальная проблема с тем, как вы это делаете.Вместо использования позиции спрайта, которая не изменится при изменении размера окна, вы должны использовать размер спрайта.Я часто делаю это, используя свойство Scale в моем классе Sprite.Таким образом, вместо фиксирования положения спрайта между 0 и 1, вы должны фиксировать свойство Size спрайта между 0 и 1. Затем, когда вы масштабируете окно, оно будет изменять масштаб спрайтов.

По моему мнению, лучший способ сделать это - использовать разрешение по умолчанию, в вашем случае 1440 x 900. Затем, если окно масштабируется, просто умножьте коэффициенты масштабирования всех спрайтов на отношениеновый экран до старого экрана.Это требует только 1 умножения на изменение размера вместо умножения на обновление (что и будет делать ваш метод, потому что вы должны преобразовывать фиксированное значение 0-1 в реальный масштаб при каждом обновлении).

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

...