[翻译]XNA 3.0 Game Programming Recipes之fifty-five


PS:自己翻译的,转载请著明出处

                                                                  8-3 加入一个网络会话
问题
                                 你想要查找你的机器,在网络中,或者在线服务为你游戏激活的会话。你想要从检测到的会话表单中去选择一个会话并且加入它。
解决方案
                                 你可以使用NetWorkSession.Find方法来收索激活的会话。这将返回一个AvailableNetworkSessionCollection对象,它包含所有的激活的会话。你可以使用NetworkSession.Join方法加入它们中的一个,指定会话作为一个argument加入。
                                 与往常一样,当我们连接到一个会话并且在前面的章节里描述的那样,确保你监听到任何会话浮起的事件。
它是如何工作的
                                 在这章里,你将会添加和定义SearchSession状态到在我们前面章节已经定义的状态:
1 public enum GameState{SignIn,SearchSession,CreateSession,InSession}
                                 再次,程序开始于SignIn状态,允许用户选择一个帐号。接下来,立即代替它创建一个新的网络会话,你将首先试图去找到并且加入一个存在的会话并且移动到InSession状态。如果没有激活的会话被发现,你将会移动到CreateSession状态,它被解释在前面的章节中。
 
Searching for Active Sessions(寻找激活的会话)
                                 你可以使用NetworkSession.Find方法来收寻所有激活的会话。这个方法期盼三个参数,它们被允许你去筛选结果。这个方法将返回唯一个相同类型的激活了的会话作为第一个参数,只允许相同数目的玩家在一台机器上作为第二个参数。你可以找到一个最后参数的实例在本节的末尾。
1 AvailablNetWorkSessionCollection activeSessions=NetworkSession.Find(NetworkSessionType.SystemLink,4,null);

注意:如同NetworkSession.Create方法,NetworkSession.Find方法将抛出一个错误如果机器没有连接任何网络。因此,你想要把它封装在try-catch结构中。
                                 所有的会话,它已经被检测到了并且满足这三个参数的过滤条件,参数被存储在一个AvailableNetworkSessionsCollection里面。如果没有会话能被找到,这个集合会是空的。

Joining an Active Session(加入一个活动的会话)
                                 如果一个近期的会话已经被检测到了,你可以使用NetworkSession.Join方法来加入它:

1 AvailableNetworkSession networkToJoin=activeSessions[0];
2 networkSession=NetworkSession.Join(networkToJoin);
                                 这将连接你的程序到指定的会话中作为这个参数。在这个例子中,你可以加入activesessions的第一个会话中。在做这个之前,你可以要检查下是否有至少有一个开放的玩家的slot,它通过networkToJoin.OpenPublicPlayerSlots来表示的。
注意:一个AvaliableNetworkSession连接一些有用的信息,例如QualityOfService属性,它对检测在你的机器和主机会话之间连接有多快是非常有用的。
                                 这个最终的SearchSession状态可以看起来象这个样子:
 1 case GameState.SearchSession:
 2 {
 3    AvilableNetworkSessinCollection activeSessions=NetworkSession.Find(NetworkSessionType.SystemLink,4,null);
 4    if(activeSession.Count==0)
 5    {
 6        currentGameState=GameState.CreateSession;
 7        log.Add("No active sessions found-proceed to CreateSession");
 8    }
 9    else
10    {
11        AvaiableNetworkSession networkToJoin=activeSessions[0];
12        networkSession=NetworkSession.Join(networkToJoin);
13        string myString="Joined session hosted by" +networkToJoin.HostGamertag;
14        myString+="with"+networkToJoin.CurrentGamerCount.ToString()+"players";
15        myString+="and"+networkToJoin.OpenPublicGamerSlots.ToString()+"open player slots.";
16        log.Add(myString);
17        HookSessionEvents();
18        currentGameState=GameState.InSession;
19    }
20 }
21 break;

                                 你通过找到所有的激活的网络会话来开始,它填满了三个过滤的参数:一个SystemLink类型的连接,一个最大的localGamers参数为4,和一个NetworkSessionProperties的空参数。如果没有会话可以被检测到,你移动到CreateSession状态去创建你自己的会话,正如前面章节所解释的。如果最近的一个激活的绘画能被找到,你加入这个第一个找到的会话。一个更高级的例子将会打印所有的变量会话到屏幕上,并且允许用户去选择其中之一。
                                 最后,你打印一些会话的属性,你加入其中,例如主机玩家的名字,已经加入这个会话中的玩家数量,和还剩下几个玩家可以加入。
                                 最后但并非最不重要的,你开始监听通过会话浮起的任何事件(参看8-2节)在移动到InSession状态之前。

Using the NetworkSessionProperties to Filter the Detected Sessions
                                 当你使用NetworkSession.Find方法来收寻激活的会话,你可以指定三个参数,这样方法将会返回唯一的这些会话,它已经通过同样的三个参数创建了。
                                 如前所述,这头两个参数允许你去指定收寻的会话的类型,以及允许加入会话的最大的本地玩家数量。
                                 不过,如果你的游戏变得非常流行了,这个Find方法将仍然返回一个巨大激活了的会话数量。因此,当你创建一个会话,它可以用来指定一个NetworkSessionProperties对象,它包含最高8个整型值。这完全取决于您选择这八个整型代表什么。例如,你可以让第一个整型表示设置游戏的难点,第二显示机器人数量,第三个是即将游戏的地图。这里,我们使用null,因为我们还没有设置这个对象。
                                当其他的玩家收寻激活的会话,它们将能够收寻游戏,例如,在一个特殊的地图上游戏。

Creating a Session with NetworkSessionProperties
                                 为了指定这个NetworkSessionProperties,你应该使用第二个NetworkSession.Create方法的重载,它接收两个以上的参数。它将允许你传入到你的属性中作为最后的参数。
                                 在你已经创建一个新的NetworkSessionProperties对象之后,它完全由你去指定八个整型值。在下面的例子中,只有两个值被设置。在这个以后,传递这个属性作为最后的参数到NetworkSession.Create方法中,现在你准备到:

1 NetworkSessionProperties createProperties=new NetworkSessionProperties();
2 createProperties[0]=3;
3 createProperties[1]=4096;
4 networkSession=NetworkSession.Create(NetworkSessionType.SystemLink,4,8,0,createProperties);


Searching for Sessions with Specific NetworkSessionProperties
                                 你可以做同样的事情去寻找指定属性的会话。简单的创建NetworkSessionProperties对象,指定这个属性,并且传递它到NetworkSession.Find的方法中:

1 NetworkSessionProperties findProperties=new NetworkSessionProperties();
2 findProperties[1]=4096;
3 AvailabNetworkSessionCollection activeSessions=NetworkSession.Find(NetworkSessionType.SystemLink,4,findProperties);

                                 这个例子,只有一个属性,而不是两个,被指定的。这个Find方法将会返回所有的变量方法,它使4096作为第二个属性,不管其他七个是什么。

代码
                                 (略)
源代码:http://shiba.hpe.cn/jiaoyanzu/WULI/soft/xna.aspx?classId=4
(完)

posted on 2009-09-06 11:59  一盘散沙  阅读(266)  评论(0编辑  收藏  举报

导航