我正在处理一个项目,并且遇到了packetreader / packetwriter类的问题。
基本上游戏加载并允许玩家创建或加入会话。当他们选择其中任何一个选项时,它会进入大厅屏幕。这部分工作正常。在大厅屏幕中,他们可以选择3种不同的选项,然后选择在准备好时开始游戏。选项详细说明了加载代表玩家的纹理,此时只是不同颜色的方块。一旦所有玩家都开始游戏,它就进入游戏界面,玩游戏。如果较慢的计算机是主机,它可以很好地工作。但是,如果较快的计算机是主机,它会加载到游戏界面中,然后较慢的计算机才有机会完成通过PacketReader和PacketWriter对象传递的所有更新。
有没有办法等到所有玩家在继续播放之前完成从这些流中读取数据?我正在使用来自客户端服务器演示http://xbox.create.msdn.com/en-US/education/catalog/sample/network_cs的代码和一个名为NetworkStateManagement的项目(由朋友找不到链接)的演示作为我的推理和逻辑的基础。任何帮助将不胜感激。
我所得到的例子。在Halo Reach中说,大厅玩家中有1人,玩家1,2,3,4,5。如果玩家1更换了他的一件盔甲,它会在大厅和实际比赛中更新其他玩家的屏幕。在我的游戏中,每个玩家都用一个颜色方块表示。我希望它在哪里如果玩家1选择红色而玩家2选择蓝色它会相应地改变。大堂屏幕由每个玩家列表和5个菜单选项组成。第一个菜单选项是Start Game,其余选项是玩家可以选择的不同颜色。选择开始游戏时,它会切换在NetworkSession对象中使用的玩家isReady状态。这是我在Update函数中的代码,如果播放器是主机并且每个人都已将自己标记为已准备好,则运行该代码。
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();
}