我正在做一个项目,并且对 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();
}