С Monogame я могу переключиться в полноэкранный режим с помощью ToggleFullScreen
без каких-либо проблем, но когда я пытаюсь переключиться обратно в оконный режим я получаю это:Monogame падает после того, как ToggleFullscreen назад к окну
SharpDX.SharpDXException был необработанное HResult = -2005270527
Message = HRESULT: [0x887A0001] Модуль: [SharpDX.DXGI], ApiCode: [DXGI_ERROR_INVALID_CALL/InvalidCall] Сообщение: заявление сделал вызов, который является недействительным. Были неверны параметры вызова или состояние какого-либо объекта. Включите слой отладки D3D для того, чтобы подробно просмотрел сообщения отладки.Источник = SharpDX StackTrace: на SharpDX.Result.CheckError() в SharpDX.DXGI.SwapChain.ResizeBuffers (Int32 bufferCount, Int32 ширина, высота Int32, Формат newFormat, SwapChainFlags swapChainFlags) на Microsoft.Xna. Framework.Graphics.GraphicsDevice.CreateSizeDependentResources (Boolean useFullscreenParameter) в Microsoft.Xna.Framework.GraphicsDeviceManager.ApplyChanges() в Microsoft.Xna.Framework.GraphicsDeviceManager.ToggleFullScreen()
Вот код:
private GraphicsDeviceManager graphics;
private Vector2 baseScreenSize = new Vector2(1280, 720);
public Game1() {
graphics = new GraphicsDeviceManager(this);
}
protected override void Initialize() {
base.Initialize();
GraphicsDevice.SamplerStates[0] = SamplerState.PointWrap;
//Work out how much we need to scale our graphics to fill the screen
float horScaling = GraphicsDevice.PresentationParameters.BackBufferWidth/baseScreenSize.X;
float verScaling = GraphicsDevice.PresentationParameters.BackBufferHeight/baseScreenSize.Y;
Vector3 screenScalingFactor = new Vector3(horScaling, verScaling, 1);
globalTransformation = Matrix.CreateScale(screenScalingFactor);
}
public void ToggleFullScreen() {
graphics.ToggleFullScreen();
}
Метод ToggleFullScreen вызывается с помощью кнопки на форме.
Что означает это исключение, и как его исправить?
Edit:
Дальнейшее тестирование показывает, что это ... я установка в способе обновления переключатель, когда нажата клавиша F:
protected override void Update(GameTime gameTime) {
if (Keyboard.GetState().IsKeyDown(Keys.F)) {
if (!debounce) { graphics.ToggleFullScreen(); debounce = true; }
}
else
debounce = false;
}
И это работает! Я могу переключиться в полноэкранный режим и из него.
Но я хочу, чтобы у меня была возможность переключать режимы из формы окна, когда пользователь нажимает кнопку. Но так как приведенный выше код работает, я подумал, может быть это просто должен быть вызван в методе Update .. Так что я попытался это:
private bool shouldToggleFullscreen = false;
public void ToggleFullScreen() {
shouldToggleFullscreen = true;
}
protected override void Update(GameTime gameTime) {
if(shouldToggleFullscreen) {
graphics.ToggleFullScreen();
shouldToggleFullscreen = false;
}
}
И это не работает. Я получаю ту же ошибку, что и выше.
Я только что нашел ответ. Это потому, что игра не является активным окном. Теперь мне просто нужно выяснить, как это сделать.
Две вещи - сделайте это - «Включите слой отладки D3D, чтобы просмотреть детали через отладочные сообщения». Затем проверьте это: «Либо параметры вызова, либо состояние какого-либо объекта были неверными». Первый должен рассказать вам, являются ли это параметрами или состоянием объекта, который виноват. – ChrisF