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


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/archive/2009/09/07/1561665.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值