2017-07-30 90 views
1

我目前正在开发一款桌面游戏,可以全屏播放,也可以播放窗口模式。当游戏窗口化时,我想确保窗口始终保持一定的宽高比,同时仍允许用户调整窗口大小。如何检测Window.ClientSizeChanged结束?

描述流程:在用户调整窗口大小后,宽度和高度将调整为捕捉到预定义的宽高比。 Stardew Valley游戏就是一个例子。当您尝试将窗口大小调整为足够小时,放开鼠标按钮后,窗口会调整(增大)至预定义的最小大小。

我想要采取的方法是检测用户完成调整窗口大小,然后手动设置窗口大小。但我不确定如何检测到这个结果“事件”。

回答

0

这是相当容易做:

  1. 确保您的窗口的大小是可以改变的,通过写Window.AllowUserResizing = true;

  2. 订阅ClientSizeChanged事件Window财产的GameWindow.ClientSizeChanged += Window_ClientSizeChanged;

  3. 在您的事件方法中(在我的情况下为Window_ClientSizeChanged),请使用Window.ClientBounds属性检查窗口大小。

  4. 如果需要,设置窗口的新值。在调整大小期间取消订阅,因此您自己的调整大小不会创建StackOverflowException(因为ApplyChanges()将再次触发此事件)并在致电ApplyChanges()后重新订阅。

    private void Window_ClientSizeChanged(object sender, System.EventArgs e) 
    { 
        Window.ClientSizeChanged -= Window_ClientSizeChanged; 
        graphics.PreferredBackBufferWidth = Window.ClientBounds.Width < 100 ? 100 : Window.ClientBounds.Width; 
        graphics.PreferredBackBufferHeight = Window.ClientBounds.Height < 100 ? 100 : Window.ClientBounds.Height; 
    
        graphics.ApplyChanges(); 
        Window.ClientSizeChanged += Window_ClientSizeChanged; 
    } 
    

就是这样。当窗口收到一个调整大小时(无论是由您,用户还是在创建时),都会触发该事件。

Stardew Valley是用XNA编写的,大部分都是一样的(它更新设置并重新计算光照贴图),但主要想法是相同的。