2016-10-15 2 views
1

С 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; 
    } 
} 

И это не работает. Я получаю ту же ошибку, что и выше.

Я только что нашел ответ. Это потому, что игра не является активным окном. Теперь мне просто нужно выяснить, как это сделать.

+0

Две вещи - сделайте это - «Включите слой отладки D3D, чтобы просмотреть детали через отладочные сообщения». Затем проверьте это: «Либо параметры вызова, либо состояние какого-либо объекта были неверными». Первый должен рассказать вам, являются ли это параметрами или состоянием объекта, который виноват. – ChrisF

ответ

0

Проблема в том, что я пытался переключить полноэкранный режим, пока окно не фокусировалось (почему это проблема, я не уверен).

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

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 
... 
if(shouldToggleFullscreen) { 
    SetForegroundWindow(Window.Handle); 
    if (IsActive) { 
     graphics.ToggleFullScreen(); 
     shouldToggleFullscreen = false; 
    } 
} 
Смежные вопросы