WisdomSoft - for your serial experiences.

9.6 サインインの管理

ユーザーがゲームにサインインしたことをイベントで受けられます。

9.6.1 イベントで処理する

ゲームの状態は、常に Update() メソッドによってフレーム毎に更新されるため、多くのゲームデータの処理は Update() メソッドの過程で計算されることになります。ゲーマーのサインインやサインアウトは、ゲームの実行中に突然発生することもあるため、ゲーマー情報をゲーム中に利用するには注意が必要です。しかし Update() の中で毎回ゲーマーのサインイン情報を確認するのも非効率的です。そこで、サインインやサインアウトが発生したときのイベントで処理する方法が考えられます。

ゲーマーがサインインすると SignedInGamer クラスの静的な SignedIn イベントが発生します。事前に、このイベントにデリゲートを登録しておくことで、ゲーマーがサインインしたタイミングで関連する初期化処理を実行できます。

SignedInGamer クラス SignedIn イベント
public static event EventHandler<SignedInEventArgs> SignedIn

このイベントに登録する EventHandler デリゲートの型パラメータには、サインインしたゲーマーの情報を提供する SignedInEventArgs クラスが指定されています。イベント発生時に呼び出されるメソッドは、このクラスをパラメータとして受け取ります。

Microsoft.Xna.Framework.GamerServices.SignedInEventArgs クラス
public class SignedInEventArgs : EventArgs

このクラスは、サインインしたゲーマーを Gamer プロパティから提供します。

SignedInEventArgs クラス Gamer プロパティ
public SignedInGamer Gamer { get; }

同じように、ゲーマーがサインアウトしたときには SignedOut イベントが発生します。

SignedInGamer クラス SignedOut イベント
public static event EventHandler<SignedOutEventArgs> SignedOut

このイベントに登録する EventHandler デリゲートの型パラメータには SignedOutEventArgs クラスが指定されています。型は異なりますが、構造は SignedInEventArgs クラスと同じで Gamer プロパティからサインアウトしたゲーマーを取得できます。

コード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;
    private SpriteBatch sprite;
    private SpriteFont font;
    private GamerProfile profile;
    private string text;

    public Test()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
        Components.Add(new GamerServicesComponent(this));
        SignedInGamer.SignedIn += GamerSignedIn;
        SignedInGamer.SignedOut += GamerSignedOut;
    }

    protected override void LoadContent()
    {
        sprite = new SpriteBatch(GraphicsDevice);
        font = Content.Load<SpriteFont>("Content/TestFont");
        base.LoadContent();
    }

    private void GamerSignedIn(object sender, SignedInEventArgs e)
    {
        if (profile == null) profile = e.Gamer.GetProfile();

        string stars = "";
        for (int i = 0; i < profile.Reputation; i++) stars += "★";

        text = e.Gamer.Gamertag + " " + stars + "\n";
        text += "Score=" + profile.GamerScore + "\n";
        text += "Region=" + profile.Region + "\n";
        text += "Zone=" + profile.GamerZone;
    }
    private void GamerSignedOut(object sender, SignedOutEventArgs e)
    {
        profile = null;
        text = "";
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);

        if (profile != null)
        {
            sprite.Begin();
            sprite.Draw(profile.GamerPicture, Vector2.Zero, Color.White);
            sprite.DrawString(
                font, text,
                new Vector2(0, profile.GamerPicture.Height), Color.Black
            );
            sprite.End();
        }
        
        base.Draw(gameTime);
    }
}
実行結果
コード1 実行結果

コード1は、「9.5 ゲーマー情報 コード2」 をイベント対応に改良したものです。Update() メソッドで常にサインインしているプレイヤーを調べるのではなく、サインインやサインアウトが発生したタイミングでデータを更新しています。コンストラクタ内で SignedIn  イベントと SignedOut イベントにデリゲートを登録し、サインインが発生すると GamerSignedIn() メソッドが、サインアウトが発生すると GamerSignedOut() メソッドが呼び出されるように設定しています。これで、Update() メソッド内では本来のゲームの進行処理に集中できます。