• [翻译]XNA 3.0 Game Programming Recipes之fiftyfive



    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
    (完)

  • 相关阅读:
    做人做事方面 对于工作
    字符截取
    git 出现 error: bad signature fatal: index file corrupt
    一个项目设置两个git地址,并最终实现一次性同时推送到到两个git地址上的方法总结
    一个项目设置两个git地址,并最终实现一次性同时推送到到两个git地址上的方法总结
    Mysql创建用户并授权以及开启远程访问
    curl 錯誤碼
    php 计算2点之间的距离
    PHP百度地图开发之距离计算的实例分享
    如何在 Debian 9 上搭建 LNMP 环境
  • 原文地址:https://www.cnblogs.com/315358525/p/1561237.html
Copyright © 2020-2023  润新知