C # XNA Масштабирование игры в зависимости от размера экрана

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

Однако кажется, что они использовали XNA 3.1, поэтому в spriteBatch.Begin они использовали некоторый код, который не работает в XNA 4.0, например SpriteBlendMode.AlphaBlend. Теперь я нашел веб-сайт, который конвертирует код 3.1 в 4.0, и я это сделал. Но это говорит

«Нет перегрузки для метода spriteBatch.Begin () принимает 3 аргумента»

в методе рисования.

На данный момент это выглядит так:

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SpriteScale);

Чего еще он хочет? Могу я просто поставить null, null после SpriteScale? Или есть более простой способ масштабировать игру в зависимости от размера экрана? Пожалуйста помоги! :)


person user2429201    schedule 28.05.2013    source источник
comment
Есть версия для XNA 4.0. Масштабирование спрайтов в зависимости от размера экрана. Я предлагаю использовать MonoGame с проектом WindowsGL.   -  person Dustin Kingen    schedule 28.05.2013
comment
Омг не видел, что у них тоже 4.0 xD Спасибо Romoku. Кажется, теперь это работает намного лучше, но когда я нажимаю кнопку A или B, масштаб игры не уменьшается, поэтому вы можете видеть всю игру в разрешении 800x600, вместо этого вы можете видеть только небольшие части игры. Я не знаю, было ли это намеренно или я что-то упустил. Также уменьшает ли этот масштаб объекты других классов, использующих собственный метод масштабирования и рисования?   -  person user2429201    schedule 28.05.2013
comment
Ознакомьтесь с комментариями к документу MSDN. Похоже, spriteBatch.Begin(); должно быть spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, SpriteScale);. Посмотрите, решит ли это вашу проблему.   -  person Dustin Kingen    schedule 28.05.2013
comment
Чтобы ответить на вторую часть вашего вопроса, я не думаю, что это будет масштабировать пользовательский масштаб / рисование. Вам нужно будет передать глобальный масштаб каждому объекту, который в нем нуждается.   -  person Dustin Kingen    schedule 28.05.2013
comment
Я сделал это, но это все еще не работает. Вы сами пробовали код?   -  person user2429201    schedule 28.05.2013
comment
Да, вероятно, отсутствует код, в котором обновляется матрица масштабирования внутри метода Update.   -  person Dustin Kingen    schedule 28.05.2013
comment
Они упомянули об этом на сайте, на который вы указали ссылку? потому что единственный код, который у них есть в обновлении, - это код, который изменяет ваше разрешение. Или я что-то упустил? Вы знаете, какой код отсутствует?   -  person user2429201    schedule 29.05.2013
comment
Нет, у них нет кода в цикле обновления. Постараюсь завтра поработать над проблемой.   -  person Dustin Kingen    schedule 29.05.2013
comment
хм .. Я не уверен, правильно ли я сделал это, но я поставил 'float screenscale = (float) graphics.GraphicsDevice.Viewport.Width / 800f;' и SpriteScale = Matrix.CreateScale (масштаб экрана, масштаб экрана, 1); вместо этого в обновлении, и теперь, похоже, он работает. Он уменьшает все мои объекты, однако я не думаю, что фон также масштабируется, потому что он не покрывает весь экран, поэтому вокруг фона есть черная пустота. Одна вещь, которую я заметил, - это то, что он также масштабирует объекты, которые используют свой собственный метод рисования / масштабирования, поэтому он работает, имеет ли высота шкалы кода также или только с помощью witdh?   -  person user2429201    schedule 29.05.2013
comment
Да, соотношение сторон не сохраняется, поскольку Matrix.CreateScale(screenscale, screenscale, 1); использует ширину дважды. Вы можете решить проблему с черной пустотой, поместив камеру и прижав ее угол обзора к краям.   -  person Dustin Kingen    schedule 29.05.2013
comment
Изменение BackBuffer изменит только то, сколько пользователь может просматривать изнутри окна. На самом деле он не масштабирует ViewPort.   -  person Dustin Kingen    schedule 29.05.2013
comment
Да, это все объясняет: D, есть ли другой способ изменить соотношение сторон игры без использования камеры? Или использование камеры - лучший вариант? :)   -  person user2429201    schedule 29.05.2013
comment
Камера - это просто абстракция для отделения логики рисования от ViewPort. Есть хорошая реализация из другого вопроса: XNA 2D Camera Engine, который следует за Sprite   -  person Dustin Kingen    schedule 29.05.2013
comment
Спасибо, я изучу это, ну, я полагаю, это решает мой вопрос. Большое вам спасибо за вашу помощь! : D   -  person user2429201    schedule 29.05.2013


Ответы (1)


Изменение BackBuffer изменит только размер области, которую может просматривать пользователь.

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

См .: XNA 2D Camera Engine, который следует за Sprite

person Dustin Kingen    schedule 29.05.2013