zoukankan      html  css  js  c++  java
  • [翻译]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
    (完)     
  • 相关阅读:
    重新认识布局:html和body元素
    重新认识布局:3d空间中的css盒子
    重新认识布局:百分比单位
    重新认识布局:标准流,浮动,定位的关系
    Redis(1.7)Redis高可用架构与数据库交互(理论篇)
    C++: 模块定义文件声明(.def)的使用
    HttpListener supports SSL only for localhost? install certificate
    跨域请求引起的 OPTIONS request
    html 浏览器自动加上 标签的详解
    c# HttpServer 的使用
  • 原文地址:https://www.cnblogs.com/315358525/p/1561665.html
Copyright © 2011-2022 走看看