WisdomSoft - for your serial experiences.

9.1 コンポーネントの登録

Xbox Live ネットワークにアクセスし、ゲーマータグや通信対戦に対応したゲーム開発を行うには、まず最初に GamerServicesComponent クラスをゲームのコンポーネントとして登録します。

9.1.1 LIVE サービス

他のゲーム開発用フレームワークには存在しない、XNA Framework 対応ゲームだけが持つ大きな特徴がゲーマーサービスです。ゲーマーサービスは、Microsoft が展開する大規模なネットワークサービスである LIVE に接続する機能を提供します。Xbox 360 でゲームを遊んだことがあれば、アカウントでユーザーを識別できるのはご存じでしょう。XNA Framework は、Xbox 360 で使われるアカウントにプログラムからアクセスできます。ネットワーク対応ゲームの開発には必須の機能で、ゲームを遊んでいるプレイヤーの情報を取得するために使われます。

Microsoft は、自社が提供する Web サービスへの接続に Windows Live ID と呼ばれる統合アカウントを提供しています。メッセンジャーなどでも使われる ID ですが、Xbox 360 にサインインするための Xbox LIVE アカウントにも Windows Live ID が使われています。Microsoft のゲームプラットフォームでは、ゲームに対して個別にアカウントを登録する必要はなく 、1 つの Windows Live ID でプレイヤーを識別できます。XNA Framework で作られた Windows 用のゲームにも、同じように Windows Live ID を用いてサインインできます。

本書執筆時点(2008年9月)で Xbox LIVE の加入者数は全世界で 1000 万人以上に達しています。XNA Framework を用いることで、この大規模なコミュニティと Microsoft が提供する巨大なネットワークインフラを使ったゲームを作ることができます。

ちなみに、Xbox 360 向けに提供されるゲームサービスは Xbox LIVE と呼びますが、Windows 向けに提供されるゲームサービスは Games for Windows - LIVE と呼ばれています。Games for Windows - LIVE に対応したゲームであれば、Xbox LIVE アカウントでサインインすることができ、Xbox 360 のプレイヤーと対戦したり、メッセージを交換したりできます。

XNA Framework が提供するゲーマーサービスは、こうした Xbox 360 のアカウント機能が、Windows 上のゲームでも同じように使うことができるようになります。Windows 向けのゲームでも、Xbox 360 のシステムと同じようにアカウントを管理し、サインインできます。サインインしたプレイヤーはフレンドの状態やメッセージの送信などを行うことができます。それも、プログラムを作り込む必要はなく、ゲーマーサービスを追加するだけで実現できます。

9.1.2 ゲームサービス

アカウントのサインインなどのゲーマーサービスに対応するには、ゲーマーサービスを提供する Microsoft.Xna.Framework.GamerServices.GamerServicesComponent クラスをコンポーネントとしてゲームに登録する必要があります。ゲーマーサービスを利用できるのは、常にシステム内で 1 つのゲームのみです。ゲーマーサービスを利用するゲームを同時に複数起動することはできません。

Microsoft.Xna.Framework.GamerServices.GamerServicesComponent クラス
public class GamerServicesComponent : GameComponent

このクラスのコンストラクタは、次のようになります。

GamerServicesComponent クラスのコンストラクタ
public GamerServicesComponent (Game game)

game パラメータには、このゲーマーサービスを利用するゲームを指定します。

GamerServicesComponent クラスは GameComponent クラスを継承しているため、ゲーム部品としてゲームに登録することができます。インスタンスを生成できれば、あとは Game クラスの Components プロパティからオブジェクトを追加することで、ゲーマーサービスに対応できます。

GamerServicesComponent をコンポーネントとして登録することで、キーボードの Home キーか、または Xbox 360 コントローラの中央にあるガイドボタンを押すと、ガイドと呼ばれるゲーマーサービスを利用するための UI が表示されるようになります。ガイドは、Xbox 360 のダッシュボードと同じような機能を提供してくれます。

コード1 (Win, Xbox 360, Zune)
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.GamerServices;

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

    private GraphicsDeviceManager graphicsDeviceManager;

    public Test()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
        Components.Add(new GamerServicesComponent(this));
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);
        base.Draw(gameTime);
    }
}
実行結果
コード1 実行結果 コード1 実行結果

コード1は、Game クラスを継承する Test クラスのコンストラクタの中で GamerServicesComponent クラスをインスタンス化し、Components プロパティを通してゲーム部品として登録しています。キーボードの Home キーか、Xbox 360 コントローラのガイドボタンを押して、ガイドを表示してください。

9.1.3 ゲーム部品を使わない方法

GamerServicesComponent は、簡単にゲーマーサービスを利用できるようになりますが、ゲーム部品を用いた開発モデルに依存してしまいます。ゲームから、ゲーマーサービス機能を制御したい場合は Microsoft.Xna.Framework.GamerServices.GamerServicesDispatcher クラスを使います。GamerServicesComponent クラスも、内部で GamerServicesDispatcher クラスを利用しているだけです。

Microsoft.Xna.Framework.GamerServices.GamerServicesDispatcher クラス
public static class GamerServicesDispatcher

このクラスは static 修飾子を持つ静的クラスなので、インスタンス化できません。ゲーマーサービスに関する機能は、すべて static なプロパティやメソッドで提供されています。

ゲームの初期化工程の中で、このクラスの WindowHandle プロパティにゲームのウィンドウハンドルを設定してください。

GamerServicesDispatcher クラス WindowHandle プロパティ
public static IntPtr WindowHandle { get; set; }

ゲーマーサービスの利用を開始するには、最初に Initialize() メソッドを呼び出して初期化する必要があります。通常は、ゲーム本体の初期化処理の中でこのメソッド呼び出す形になるでしょう。

GamerServicesDispatcher クラス Initialize() メソッド
public static void Initialize (IServiceProvider serviceProvider)

ゲーマーサービスの状態は Update() メソッドによって更新されます。ゲームの Update() メソッド内から、GamerServicesDispatcher クラスの Update() メソッドを呼び出して、フレーム毎にゲーマーサービスの状態を更新してください。

GamerServicesDispatcher クラス Update() メソッド
public static void Update ()

これで、ゲーマーサービスを利用する手続きは終了です。ゲーム部品として追加するだけで、すべての機能を使えるようになった GamerServicesComponent クラスに比べると少し面倒ですが、それでもわずかなコードでゲーマーサービスに対応できます。

コード2 (Win, Xbox 360, Zune)
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.GamerServices;

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

    private GraphicsDeviceManager graphicsDeviceManager;

    public Test()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
    }

    protected override void Initialize()
    {
        GamerServicesDispatcher.WindowHandle = Window.Handle;
        GamerServicesDispatcher.Initialize(Services);
        base.Initialize();
    }

    protected override void Update(GameTime gameTime)
    {
        GamerServicesDispatcher.Update();
        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);
        base.Draw(gameTime);
    }
}
実行結果
コード2 実行結果

コード2は、GamerServicesDispatcher クラスを用いてゲーマーサービスを利用しています。実行すると、コード1と同じようにガイドを表示して利用できることが確認できます。ゲーム部品の中に、本来のゲーム処理とは無関係なオブジェクトを含ませたくない場合や、ゲーム部品を用いた開発モデルを使用しない場合に、この手法が用いられます。