[翻译]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:
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 }
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事件,所有的玩家都可以监听它。这是允许他们绘制游戏到屏幕上,并且开始发送和接收游戏的数据。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;
主机应该调用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事件,所有的玩家想去监听它,所以它们可以,例如,绘制你的大厅图象。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;
代码
(略)
<<XNA 3.0 Game Programming Recipes>>所有翻译结束!感谢收看!
源代码:http://shiba.hpe.cn/jiaoyanzu/WULI/soft/xna.aspx?classId=4
(完)