[翻译]XNA 3.0 Game Programming Recipes之fiftynine


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

                                                           8-7 从大厅移动到实际的游戏中
问题
                                  在你创建一个会话之后,你想要得到所有你的玩家同时一起,聊天,并允许它们发信号通知,他们已经准备好开始游戏了。
解决方案
                                  XNA来自于基本内置的大厅功能在会话的状态的轮廓和一个玩家的IsReady属性。
                                  一个会话将开始在Lobby状态。只有主机可以调用NetworkSession.StartGame方法,它将移动会话到Playing状态。主机可以基于这个决定在所有玩家的IsReady标志的状态上。
它是如何工作的
                                  当会话已经被创建了,会话的SessionState属性将有Lobby的值。同时在这个状态中,你应该允许所有在这个会话里的玩家发信号他们已经准备好了,他们可以通过设置他们的IsReady标志为true来实现这个。这里,我们通过允许玩家去压下在控制台上的R按钮表明准备就绪。这个值可以通过会话里的其他玩家来读取:
 1 case GameState.InSession:
 2 {
 3     switch(networkSession.SessionState)
 4     {
 5          case NetworkSessionState.Lobby:
 6          {
 7                 if(keyState!=IastKeyState)
 8                 {
 9                     if(keyState.IsKeyDown(Keys.R))
10                     {
11                           LocalNetworkGamer localGamer=networkSession.LocalGamers[0];
12                           localGamer.IsReady=!localGamer.IsReady;
13                     } 
14                 }
15          }
16          break;
17          case NetworkSessionState.Playing:
18          {}
19          break;
20     }
21     networkSession.Update();
22 }         
                                   主机可以检测所有的玩家是否设置他们的IsReady标志为true了吗。最简单的方法是通过检查NetworkSession.IsEveryoneReady的值来实现,这个值可以精确表明这种情况。如果每个人都准备好了,主机可以调用NetworkSession.StartGame的方法,它移动会话的状态从Lobby到Playing:
 1 case NetworkSessionState.Lobby:
 2 {
 3      if(keybState!=lastKeybState)
 4      {
 5          if(keybState.IskeyDown(Keys.R))
 6          {
 7                LocalNetworkCamer localGamer=networkSession.LocalGamers[0];
 8                localGamer.IsReady=!localGamer.IsReady;
 9          }
10      }
11      if(networkSession.IsHost)
12      {
13            if(networkSession.AllGamers.Count>1)
14            {
15                  if(networkSession.IsEveryoneReady)
16                  {
17                          networkSession.StartGame();
18                          log.Add("All players ready--start the game!");
19                  }
20            }
21      }
22 }
23 break;
                                   当状态改变成Playing,这个会话上升它的GameStarted事件,所有的玩家都可以监听它。这是允许他们绘制游戏到屏幕上,并且开始发送和接收游戏的数据。
                                   主机应该调用NetworkSession.EndGame方法,当主机决定游戏已经结束。这将重新设置所有玩家的IsReady属性为false,并且返回到Lobby状态。在下面的代码中,当玩家压下E按钮将会实现:
 1 case NetworkSessionState.Playing:
 2 {
 3      if(networkSession.IsHost)
 4      {
 5          if(keybState!=lastKeybState)
 6          {
 7               if(keybState.IsKeyDown(keys.E))
 8               {
 9                     networkSession.EndGame();
10               }
11          }
12      }
13 }
14 break;
                                    这将上升会话的GameEnded事件,所有的玩家想去监听它,所以它们可以,例如,绘制你的大厅图象。
代码
                         (略)
<<XNA 3.0 Game Programming Recipes>>所有翻译结束!感谢收看!
源代码:http://shiba.hpe.cn/jiaoyanzu/WULI/soft/xna.aspx?classId=4
(完)     
原文地址:https://www.cnblogs.com/315358525/p/1561665.html