2017-07-30 18 views
1

現在のところ、全画面表示モードとウィンドウモードの両方で再生できるデスクトップゲームに取り組んでいます。ゲームのウィンドウが開かれているときに、ウィンドウのサイズを変更することを許可しながら、ウィンドウが常に一定のアスペクト比を維持するようにしたい。どのようにWindow.ClientSizeChanged終了を検出できますか?

フローを説明する:ユーザーがウィンドウのサイズを変更した後、幅と高さがあらかじめ定義されたアスペクト比にスナップするように調整されます。これの一例は、ゲームスターデーバレーです。マウスのボタンを離した後、ウィンドウのサイズを十分に小さくしようとすると、ウィンドウはあらかじめ定義された最小サイズにサイズ変更(拡大)します。

私が取りたいと思っているアプローチは、ユーザーがウィンドウのサイズ変更を完了したことを検出してから、手動でウィンドウサイズを設定することです。しかし、私はどのようにその終わりの "イベントを検出するか分からない。

答えて

0

これは作ることが比較的容易である:

  1. Window.AllowUserResizing = true;

  2. を書き込むことによって、あなたの窓のサイズを変更することができることを確認してくださいはGameWindow財産のClientSizeChangedイベントを購読します。 Window.ClientSizeChanged += Window_ClientSizeChanged;

  3. あなたのイベントメソッド(私の場合はWindow_ClientSizeChanged)で、Window.ClientBoundsプロパティを使用してwindowsizeを確認します。

  4. 必要に応じて、ウィンドウの新しい値を設定します。サイズ変更中にサブスクリプション解除するとStackOverflowExceptionApplyChanges()がこのイベントを再開するため)が作成されず、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; 
    } 
    

そして、それはそれです。このイベントは、ウィンドウがサイズ変更を受け取るたびに(ユーザー、作成者または作成者のいずれかによって)起動されます。

スターダウンバレーはXNAで書かれており、ほとんど同じ設定(ライトマップを更新し、再計算します)ですが、主なアイデアは同じです。

関連する問題