1

我正在做一个项目,并且对 packetreader/packetwriter 类有疑问。

基本上游戏加载并允许玩家创建或加入会话。当他们选择其中任何一个选项时,它会进入大厅屏幕。这部分工作正常。在大厅屏幕上,他们可以在 3 个不同的选项之间进行选择,然后在准备好后选择开始游戏。这些选项详细说明了要加载什么纹理来代表玩家,并且此时只是不同颜色的方块。一旦所有玩家都点击开始,它就会进入游戏画面。如果较慢的计算机是主机,则它可以正常工作。但是,如果较快的计算机是主机,它会在较慢的计算机有机会完成运行通过 PacketReader 和 PacketWriter 对象的所有更新之前加载到游戏屏幕中。

有没有办法等到所有玩家都完成从这些流中读取数据后再继续?我正在使用来自客户端服务器演示http://xbox.create.msdn.com/en-US/education/catalog/sample/network_cs的代码和一个名为 NetworkStateManagement 的演示项目(被朋友发现但不记得链接)作为我推理和逻辑的基础。任何帮助将不胜感激。

我得到的例子。在 Halo Reach 中,假设大厅中有 5 个人,玩家 1、2、3、4、5。如果玩家 1 更换了他的一件盔甲,它会在大厅和实际比赛中的其他玩家屏幕上更新。在我的游戏中,每个玩家都由一个彩色方块表示。我想要它,如果玩家 1 选择红色,玩家 2 选择蓝色,它会相应地改变。大厅屏幕由每个玩家的列表和 5 个菜单选项组成。第一个菜单选项是开始游戏,其余选项是玩家可以选择的不同颜色。选择开始游戏时,它会切换网络通用对象中使用的播放器已准备就绪状态。这是我在我的更新函数中的代码,如果玩家是主机并且每个人都将自己标记为准备好,则运行该代码。

else if (networkSession.IsHost && networkSession.IsEveryoneReady) 
{ 
     // Before starting the game make sure the server has gone through and updated. 
     // Also go through each player and make sure they have been updated so that no information is left in the packetReader and packetWriter 
     if (packetReader.Length > 0) 
     { 
         UpdateServer(); 
     } 
     // Read any incoming network packets. 
     foreach (LocalNetworkGamer gamer in networkSession.LocalGamers) 
     { 
         if (gamer.IsHost) 
         { 
             ServerReadInputFromClients(gamer); 
         } 
         else 
         { 
             ClientReadGameStateFromServer(gamer); 
         } 
     } 
     // The host checks whether everyone has marked themselves 
     // as ready, and starts the game in response. 
     networkSession.StartGame(); 
} 
4

0 回答 0