18,356
社区成员
发帖
与我相关
我的任务
分享
while(game_host[now_roomnum].Ready(now_playernum)) //如果上一个消息还没有取走,等待
{
Sleep(1);
}
game_host[now_roomnum].SetMessage(now_playernum, recv_msg->msg);
game_host[now_roomnum].SetReady(now_playernum, true);
game_host[now_roomnum].SetUsed(now_playernum, false);
while(!game_host[now_roomnum].AllReady())//等待本游戏中的所有人都发来消息
{
Sleep(1);
}
string all_msg = game_host[now_roomnum].GetAllMessage();
game_host[now_roomnum].SetUsed(now_playernum, true);
while(!game_host[now_roomnum].AllUsed())//等待本游戏内的所有人都获取了消息
{
Sleep(1);
}
game_host[now_roomnum].SetReady(now_playernum, false);//标记该消息已经无效了
strcpy_s(ret.msg, all_msg.c_str());
GameState CGame::Update(float game_time)
{
CMessage msg = MakeMessage(game_time); //将这两帧之间的时间以及操作队列做成一个消息
CMessage recv = p_res_manager->m_Client._SendMessage(msg);//发送消息,并在服务器返回消息前等待
stringstream input(recv.msg);
int i;
rest_time -= game_time;
float game_times[MAX_PLAYER+1]={0};
//analyze recv operations
for(i=1; i<=MAX_PLAYER; i++)
{
int n;
input>>n;
input>>game_times[i];//解析消息,先取出消息个数n,然后取出第i个玩家这两帧间经过的时间game_times[i]
for(int oper_i = 1; oper_i <= n; oper_i++)//然后取出这两帧间的n个操作并改变状态
{
int now_event;
UINT nchar;
input>>now_event>>nchar;
if(now_event == int(Event::KEY_UP))
HandleKeyUpInUpdate(i, nchar);
else //if(now_event == int(Event::KEY_DOWN))
HandleKeyDownInUpdate(i, nchar);
}
}
//update player,根据game_times[i]来更新玩家状态,基本的方法就是s[i] = v[i] *game_times[i]
for(i=1; i<=MAX_PLAYER; i++)
{
player[i].Update(game_times[i]); // 用第i个玩家的这两帧的更新时间来更新玩家状态
……………………
}