Поддержка нескольких разрешений в приложении MonoGame Windows 8 XAML

Я пишу игру для Windows 8, используя MonoGame 3.01 и SwapChainBackgroundPanel для интеграции с XAML. Мои активы оптимизированы для соотношения сторон 16:9, хотя мне также необходимо поддерживать 4:3 из-за различий в разрешениях устройств Win8.

В настоящее время я сталкиваюсь со следующими проблемами:

  1. Перетаскивание игры на второй монитор не меняет размер экрана

        _graphics.PreferredBackBufferWidth = (int)width;
        _graphics.PreferredBackBufferHeight = (int)height;
        _graphics.ApplyChanges();
    

В SwapChainBackgroundPanel (GamePage) я реагирую на изменение размера

    void GamePage_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        Game.SetBackBuffer(e.NewSize.Width, e.NewSize.Height);
    }

Но ничего не происходит, похоже, применяется только начальное (после инициализации игры) изменение заднего буфера.

  1. Есть ли способ сохранить соотношение сторон вместо растягивания до заполнения, например. через почтовый ящик?

Как лучше всего поддерживать несколько разрешений в Windows 8 (включая режим Snapped)?

РЕДАКТИРОВАТЬ: Просто для уточнения - GamePage_SizeChanged выполняется просто _graphics.ApplyChanges(), который, похоже, не имеет никакого эффекта


person Piotr Walat    schedule 10.03.2013    source источник


Ответы (1)


Почему бы вам не попробовать добавить событие Client Size Changed Event в конструктор игры.

Пример:

public Game1()
{
    _graphics = new GraphicsDeviceManager(this);
    this.Windows.ClientSizeChanged += Window_ClientSizeChanged;
}

void Window_ClientSizeChanged(object sender, EventArgs e)
{
    int currentWidth = this.Window.ClientBounds.Width;
    int currentHeight = this.Windows.ClientBounds.Height;
}

Вы также можете добавить обработчик событий для ApplicationViewChanged, чтобы обнаруживать Snapped, Filled и Full ViewStates, сравнивая ViewChangeArgs с перечислением ApplicationViewState в Windows8. У вас есть доступ к SwapChainBackgroundPanel вашей игры из свойства _graphics.SwapChainPanel. Наконец, у вас также есть _graphics.GraphicsDevice.DisplayMode с параметрами AspectRatio, Height, Width.

person TaraW    schedule 11.03.2013
comment
Спасибо, я знаю, где реагировать на изменение размера, но проблема в том, что изменение PreferredBackBufferWidth не дает никакого эффекта. И я не знаю, как сделать масштабирование контента с сохранением соотношения сторон без ручных преобразований. - person Piotr Walat; 11.03.2013
comment
Для Windows 8 PreferredBufferWidth предварительно установлен в MonoGame на 1366, 760. У вас есть доступ к текущему GraphicDevice и обработчикам событий для начала и окончания DeviceChanging, поэтому вы сможете изменить размер устройства там. Позвольте мне попробовать изменить это в моей игре, и я опубликую код. - person TaraW; 12.03.2013