ネットワーク:ネットワークセッションを追加

8092 ワード

に質問
マシン、ネットワーク、またはLiveサービスを検索してアクティブなセッションを見つけたい場合は、検出されたセッションのリストからセッションを選択して参加したい場合があります.
ソリューション
NetworkSessionsを使うことができます.Findメソッドは、使用可能なすべてのセッションを含むAvailableNetworkSessionCollectionオブジェクトを返す使用可能なセッションを検索します.NetworkSessionを使用できます.Joinメソッドは、指定したセッションをパラメータとして追加します.
前のチュートリアルで説明したように、セッションに接続するときは、このセッションによって開始されたイベントをリスニングすることを確認します.
さぎょうげんり
このチュートリアルでは、前のチュートリアルで定義したGameState列挙にSearchSessionステータスを追加します.
public enum GameState ...{ SignIn, SearchSession, CreateSession, InSession}

プログラムはSignIn状態から始まり,ユーザがアカウントを選択できるようにする.その後、すぐに新しいネットワークセッションを作成するのではなく、まず既存のセッションを見つけて追加し、InSession状態に入ります.使用可能なセッションが見つからない場合は、前のチュートリアルで説明したCreateSessionステータスに入ります.
使用可能なセッションの検索
NetworkSessionを使用できます.Findメソッドは、使用可能なすべてのセッションを検索します.このメソッドには、結果をフィルタできる3つのパラメータが必要です.この方法は、最初のパラメータと同じタイプで、1台のマシンで許可されているプレイヤーの数と同じセッションのみを返します.このチュートリアルの最後に最後のパラメータの例を見つけることができます.
AvailableNetworkSessionCollection activeSessions = NetworkSession.Find(NetworkSessionType.SystemLink, 4, null); 

注意:およびNetworkSession.Createメソッドと同様に、マシンがネットワークに接続されていない場合はNetworkSession.Findメソッドはエラーを報告します.したがって、try-catch構造にカプセル化する必要があります.
検出されたすべてのセッションは、セッションが見つからない場合は空のAvailableNetworkSessionsCollectionに格納されます.
アクティブなセッションに参加
少なくとも1つのセッションが検出された場合、NetworkSessionを使用できます.Joinメソッドを追加します.
AvailableNetworkSession networkToJoin = activeSessions[0]; 

networkSession = NetworkSession.Join(networkToJoin); 

これにより、プログラムは最初のパラメータで指定されたセッションに接続されます.この例では、activeSessionsの最初のセッションに参加します.この操作を行う前に、少なくとも1人のプレイヤーがいるかどうかをチェックしたいかもしれません.これはnetworkToJoinです.OpenPublicPlayerSlotsで表示されます.
注意:AvailableNetworkSessionには、多くの有用な情報が含まれています.QualityOfServiceプロパティは、マシンとセッションホスト間の接続速度を判断するために使用できます.
最後のSearchSession状態は次のようになります.
case GameState.SearchSession:

...{

    AvailableNetworkSessionCollection activeSessions = NetworkSession.Find(NetworkSessionType.SystemLink, 4, null); 

    if (activeSessions.Count == 0)

    ...{

        currentGameState = GameState.CreateSession;

        log.Add("No active sessions found - proceed to CreateSession");

        AvailableNetworkSession networkToJoin = activeSessions[0]; 

        networkSession = NetworkSession.Join(networkToJoin);



        string myString = "Joined session hosted by " + networkToJoin.HostGamertag; 

        myString += " with " + networkToJoin.CurrentGamerCount.ToString() +  " players";

        myString += " and " + networkToJoin.OpenPublicGamerSlots.ToString() + " open player slots.";

        log.Add(myString);

        HookSessionEvents();

        currentGameState = GameState.InSession; 

    }

}

break;

まず、3つのフィルタパラメータを指定したすべてのアクティブなセッションを見つけます.セッションが検出されない場合は、CreateSessionステータスに入って独自のセッションを作成します.前のチュートリアルを参照してください.少なくとも1つのセッションが見つかった場合は、見つかった最初のセッションに参加します.より高度な例では、すべてのセッションが画面に表示され、ユーザーが選択できるようになります.
次に、ホスト名、このセッションに参加したプレイヤー数、開いているプレイヤーslotsの数など、接続されたセッション属性を画面に表示します.
最後に、セッションによって開始されたイベントのリスニングをInSession状態に入る前に開始します(チュートリアル8-2を参照).
NetworkSessionPropertiesを使用して検出されたセッションをフィルタ
NetworkSessionを使用する場合Findメソッドがアクティブなセッションを検索する場合、検出されたセッションをフィルタする3つのパラメータを指定できます.
前述したように、前の2つのパラメータでは、セッションの種類とセッションが許可する最大プレイヤー数を指定できます.
しかし、ゲームが非常に流行すると、Findメソッドは多くのアクティブなセッションを返します.したがって、セッションを作成するときにNetworkSessionPropertiesオブジェクトを指定すると便利です.このオブジェクトには最大8つの整数値が含まれます.この8つの整数が何を表しているかは完全にあなた次第です.たとえば、最初の整数をゲームの難易度設定、2番目のbotsの数、3番目のゲームが存在する地図を表すことができます.この例ではnullに設定します.このオブジェクトはまだ設定されていないからです.
別のプレイヤーがアクティブなセッションを検索すると、対応するゲームを検索することができます.例えば、指定された地図上でゲームを行うことができます.
NetworkSessionPropertiesによるセッションの作成
NetworkSessionPropertiesを指定するには、NetworkSessionを使用する必要があります.Createの2番目のリロード方法は、プロパティを最後のパラメータとして使用できる他の2つのパラメータを受け入れます.新しいNetworkSessionPropertiesオブジェクトを作成すると、8つの整数値を設定できます.次の例では、2つの値のみを設定します.その後、属性を最後のパラメータとしてNetworkSessionに渡す.Createメソッド:
NetworkSessionProperties createProperties = new NetworkSessionProperties(); 

createProperties[0] = 3; 

createProperties[1] = 4096; 



networkSession = NetworkSession.Create(NetworkSessionType.SystemLink, 4, 16, 0, createProperties); 

指定したNetworkSessionPropertiesを使用してセッションを検索
指定したプロパティを使用してセッションを検索できます.NetworkSessionPropertiesオブジェクトを簡単に作成し、検索するプロパティを指定してNetworkSessionに渡すだけです.Findメソッド:
NetworkSessionProperties findProperties = new NetworkSessionProperties(); 

findProperties[1] = 4096; 



AvailableNetworkSessionCollection activeSessions = NetworkSession.Find(NetworkSessionType.SystemLink, 4, findProperties); 

この例では、2つではなく1つの値のみが使用されます.Findメソッドは、他の7つのプロパティが何であるかにかかわらず、2番目のプロパティのうち4096を持つすべてのメソッドを返します.
コード#コード#
次のUpdateメソッドでは、基本的なセッション管理が表示されます.
プログラムが開始されると、ユーザーはアカウントを使用してログインするように要求し、プログラムはアクティブなセッションを検索し、少なくとも1つが見つかったら、このセッションに参加します.
アクティブなセッションが見つからない場合、プログラムは独自のセッションを作成します.いずれにしても、セッションに接続され、セッションによって発生したイベントをリスニングする必要があります.セッションはInSession状態で終了し、一定の時間間隔で更新されます.
同じコードは複数のマシンで実行できます.これらのマシンが同じネットワークに接続されている場合、最初のマシンはセッションを作成し、他のマシンはこのセッションを検出して自動的に追加します.
protected override void Update(GameTime gameTime)

...{

    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 

        this.Exit();



    if (this.IsActive)

...    {

        switch (currentGameState)

...        {

            case GameState.SignIn:

...            {

                if (Gamer.SignedInGamers.Count < 1)

...                {

                    Guide.ShowSignIn(1, false);

                    log.Add("Opened User SignIn Interface");

                }

                else

...                {

                    currentGameState = GameState.SearchSession; 

                    log.Add(Gamer.SignedInGamers[0].Gamertag + " logged in - proceed to SearchSession");

                }

            }

            break;

            case GameState.SearchSession:

            ...{

                NetworkSessionProperties findProperties = new NetworkSessionProperties();

                findProperties[0] = 3;

                findProperties[1] = 4096;

                AvailableNetworkSessionCollection activeSessions NetworkSession.Find(NetworkSessionType.SystemLink,4, findProperties);

                if (activeSessions.Count == 0)

...                {

                    currentGameState = GameState.CreateSession;

                    log.Add("No active sessions found - proceed to CreateSession");

                }

                else

...                {

                    AvailableNetworkSession networkToJoin = activeSessions[0];

                    networkSession = NetworkSession.Join(networkToJoin);

                    string myString = "Joined session hosted by " + networkToJoin.HostGamertag; 

                    myString += " with " + networkToJoin.CurrentGamerCount.ToString() + " players"; 

                    myString += " and " + networkToJoin.OpenPublicGamerSlots.ToString() + " open player slots.";

                    log.Add(myString);

                    HookSessionEvents();

                    currentGameState = GameState.InSession;

                }

            }

            break;

            case GameState.CreateSession: 

            ...{

                NetworkSessionProperties createProperties = new NetworkSessionProperties(); 

                createProperties[0] = 3;

                createProperties[1] = 4096;



                networkSession = NetworkSession.Create(NetworkSessionType.SystemLink, 4, 16, 0, createProperties);

                networkSession.AllowHostMigration = true; 

                networkSession.AllowJoinInProgress = false;

                log.Add("New session created");

                HookSessionEvents();

            currentGameState = GameState.InSession;

            }

            break;

            case GameState.InSession:

...            {

                networkSession.Update();

            }

            break;

        }

    }

    base.Update(gameTime); 

}