我目前正在开发一款桌面游戏,可以在全屏模式和窗口模式下播放。当游戏开窗时,我想确保窗口始终保持一定的宽高比,同时仍允许用户调整窗口大小。
描述流程:在用户调整窗口大小后,宽度和高度将调整为捕捉到预定义的宽高比。一个例子是Stardew Valley游戏。当您尝试将窗口调整为足够小的尺寸时,在放开鼠标按钮后,窗口会调整(增长)到预定义的最小尺寸。
我想采取的方法是检测用户何时完成窗口大小调整,然后手动设置窗口大小。但我不确定如何发现那个结束的“事件。”
答案 0 :(得分:0)
这很容易做到:
通过撰写Window.AllowUserResizing = true;
订阅ClientSizeChanged
中Window
媒体资源的Game
事件。 Window.ClientSizeChanged += Window_ClientSizeChanged;
在您的事件方法中(在我的情况下为Window_ClientSizeChanged
),使用Window.ClientBounds
属性检查窗口大小。
如果需要,设置窗口的新值。在调整大小期间取消订阅,因此您自己的调整大小不会创建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编写的,大致相同(更新设置并重新计算光照贴图),但主要思路是一样的。