C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(二十三)自適應性窗口化與全屏化(WPF Only)
上一節中曾有提到,檢測系統架構是否合理的評判標准之一就是系統的拓展性。在.Net網站應用中,一個優秀的架構可以在不同數據庫之間相互轉換,可以與不同的銀行接口輕松對接,可以隨意集成各種插件,而實現這些僅僅需要對局部進行小小手術而已;同樣的,在游戲設計中,窗口化與全屏化的自適應完美切換同樣是對游戲架構合理性的嚴肅考驗,Are you ready?
游戲窗口化與全屏化之間的切換方式有兩種,第一種為僅對可視范圍面積進行擴大與縮小而不縮放所有對象物體的尺寸。此方式在本游戲設計中實現起來非常簡單,我們首先添加一個按鈕作為測試按鈕,然後為其添加ChangeWindowMode事件,接著定義四個變量分別記錄全屏時的尺寸與窗口化時的尺寸:double ScreenWidth, ScreenHeight, WindowWidth, WindowHeight,並來在游戲初始化對它們進行賦值:
private void InitializeGameSetting() {
//設置尺寸
ScreenWidth = SystemParameters.PrimaryScreenWidth;
ScreenHeight = SystemParameters.PrimaryScreenHeight;
WindowWidth = 800;
WindowHeight = ScreenHeight * WindowWidth / ScreenWidth; //根據屏幕分辨率計算出窗口模式下高度
……
}
前三個屬性都很好理解,而第四個WindowHeight為什麼非要用公式來計算出值而不是直接取600來得干脆?這涉及到窗口自適應用戶電腦分辨率的問題。如果您的電腦是4:3類型的分辨率,如800*600、1024*768、1280*960等這樣的傳統分辨率,你大可以直接設置WindowWidth=800、WindowHeight=600;但是用戶的電腦如果是寬屏的(如16:9等),此時設置窗口模式尺寸為800*600將導致全屏化切換錯誤。一般網絡游戲中會給予幾個或多個可選分辨率讓用戶自行設置窗口化/全屏化切換,這些切換的實現基於對系統分辨率及刷新率進行更改的基礎上;而WPF中實現起來簡單多了,不需要再去調用WindowsAPI更改系統設置而是直接通過修改窗體自身屬性WindowStyle與Windowstate輕松實現,具體方法如下:
private void ChangeWindowMode(object sender, RoutedEventArgs e) {
Button button = e.Source as Button;
string mode = button.Content.ToString();
if (mode == "全屏") {
this.WindowStyle = Windowstyle.None;
this.WindowState = Windowstate.Maximized;
button.Content = "窗口";
} else if (mode == "窗口") {
this.WindowStyle = Windowstyle.SingleBorderWindow;
this.WindowState = Windowstate.Normal;
button.Content = "全屏";
}
}
需要切換全屏時,我們只需要將窗口的標題欄與邊框去掉(WindowStyle.None),並且設置窗口模式為最大化(WindowState.Maximized)即可;而如果需要將游戲窗口化則只需將窗口模式設置為單邊框窗口(WindowStyle.SingleBorderWindow)並還原窗口(Windowstate.Normal)即可。通過此方法實現的窗口化與全屏化的效果圖如下: