WisdomSoft - for your serial experiences.

ウィンドウ制御

Windows PC 用のゲームの場合、ウィンドウは XNA Framework がゲームを開始すると自動的に生成してくれます。ゲームのウィンドウを取得し、タイトルバーのテキストを変更するといったことが可能です。ただし、Xbox 360 や Windows Phone 7 といった非 Windows PC 環境では効果がありません。

ゲームウィンドウのタイトルを変更する

Xbox 360 や Windows Phone には、Windows のようなデスクトップが存在しないため、ウィンドウという概念がありません。そのため XNA Framework は、ウィンドウを持つことを前提とされていませんが、ゲーム画面を持つ抽象的なコンテナとしてのウィンドウを Microsoft.Xna.Framework.GameWindow クラスで表現しています。

Microsoft.Xna.Framework.GameWindow クラス
public abstract class GameWindow

このクラス自身は abstract であり、実装はゲームを実行する Game クラスの Window プロパティによって提供されます。

Game クラス Window プロパティ
public GameWindow Window { get; }

このプログラムは、Game オブジェクトに関連付けられているウィンドウを返します。Xbox 360 上でも GameWindow オブジェクトを取得することはできますが、一部のプロパティやメソッドは機能しないため、無視されるものもあります。例えば、タイトルバーの設定などは Xbox 360 では機能しません。

ウィンドウのタイトルバーには、デフォルトでゲームの名前(正確には、アセンブリに指定されている AssemblyTitleAttribute 属性に設定されているタイトル)が入力されていますが Title プロパティを設定することで変更できます。

GameWindow クラス Title プロパティ
public string Title { get; set; }

このプロパティに設定した文字列は、ウィンドウのタイトルバー上にテキストとして表示されます。ウィンドウを持たない Xbox 360 や Zune では、このようなウィンドウ関連のプロパティは無視されます。Windows 用のゲームを開発する場合、通常はゲームのタイトルとなるテキストを入力することになるでしょう。また、ゲーム操作の状態によって動的に変更するという方法も考えられます。

コード1
using Microsoft.Xna.Framework;

public class Test : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new Test()) game.Run();
    }

    public Test()
    {
        Window.Title = "魔法少女まどべ☆ななみ";
    }
}
実行結果
コード1 実行結果

コード1は、コンストラクタで Window プロパティから取得した GameWindow オブジェクトの Title プロパティに文字列を代入します。実行結果を見れば、設定した文字列がウィンドウのタイトルバーに表示されていることを確認できます。

サイズ変更

デフォルトのゲームのウィンドウは、プレイヤーによるサイズの変更を許可していません。多くのゲームは、特定の解像度に最適化されているため、ウィンドウのサイズをプレイヤーによって変更されるのは、多くのゲーム開発者にとって都合の良いことではありません。

しかし、描画処理がシンプルで、利便性の都合からウィンドウのサイズを自由に変更できたほうが良い場合や、XNA Framework を使っているものの、ゲームではなくツール的な性質が強い場合は、一般的なアプリケーションと同じようにウィンドウのサイズを自由に変更できるようにしたいと考えることでしょう。

プレイヤーが自由にウィンドウのサイズを変更できるようにするには、GameWindow クラスの AllowUserResizing プロパティを使います。 

GameWindow クラス AllowUserResizing プロパティ
[DefaultValueAttribute(false)]
public abstract bool AllowUserResizing { get; set; }

このプロパティの値が true の場合、ウィンドウのサイズをプレイヤーが自由に変更できます。false の場合、ウィンドウサイズは固定となります。

プレイヤーがウィンドウのサイズを変更すると ClientSizeChanged イベントが発生します。サイズ変更を感知して、何らかの処理を実行したい場合に使います。

GameWindow クラス ClientSizeChanged イベント
public event EventHandler<EventArgs> ClientSizeChanged

このイベントには、System 名前空間の EventHandler デリゲートを登録します。ウィンドウのサイズが変更されると、登録したデリゲートが実行されます。

コード2
using Microsoft.Xna.Framework;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new Game()) 
        {
            game.IsMouseVisible = true;
            game.Window.AllowUserResizing = true;
            game.Window.ClientSizeChanged += (sender, e) => game.Window.Title = "Changed";

            game.Run();
        }
    }
}
実行結果
コード2 実行結果

コード2は、GameWindow オブジェクトの AllowUserResizing プロパティを true に設定しているため、ウィンドウのサイズをプレイヤーが変更できます。通常の Windows アプリケーションと同様に、ウィンドウの枠をドラッグしてサイズ変更できます。また、ウィンドウサイズを変更すると ClientSizeChanged に登録している匿名メソッドが実行され、ウィンドウのタイトルを "Changed" に変更します。