/// <summary> /// 处理上一帧操作 /// </summary> /// <param name="frameOpts"></param> private void OnHandlerFrameEvent(FrameOpts frameOpts) { //调用logicUpdate OnFrameHandleHeroLogic(); //把所有玩家的操作带入处理 for (int i = 0; i < frameOpts.opts.Count; i++) { int seatid = frameOpts.opts[i].seatid; Hero h = GetHeroBySeatID(seatid); if (h == null) { Debug.LogError("cannot find hero by seatid: " + seatid); continue; } h.OnHandlerFrameEvent(frameOpts.opts[i]); } //同步小兵位置 OnFrameHandleMonsterLogic(); //同步塔的子弹 OnFrameHandleTowerBulletLogic(); //塔和怪物AI根据操作产生相应 OnFrameHandleTowerLogic(); //同步小兵AI OnFrameHandleMonsterAI(); //产生一波小兵 GenMonster(); }
public static PacketDistributed CreatePacket(MessageID packetID) { PacketDistributed packet = null; switch (packetID) { case MessageID.GCErrorBack: { packet = new GCErrorBack(); } break; case MessageID.CGheartbeatClientSend: { packet = new CGheartbeatClientSend(); } break; case MessageID.GCheartbeatServerBack: { packet = new GCheartbeatServerBack(); } break; case MessageID.GCServerMsg: { packet = new GCServerMsg(); } break; case MessageID.OptionEvent: { packet = new OptionEvent(); } break; case MessageID.FrameOpts: { packet = new FrameOpts(); } break; case MessageID.LogicFrame: { packet = new LogicFrame(); } break; case MessageID.NextFrameOpts: { packet = new NextFrameOpts(); } break; case MessageID.GamePlayerInfo: { packet = new GamePlayerInfo(); } break; case MessageID.EnterGame: { packet = new EnterGame(); } break; } if (null != packet) { packet.packetID = packetID; } //netActionTime = DateTime.Now.ToFileTimeUtc(); return(packet); }
private void on_logic_update(string name, object udata) { LogicFrame frame = (LogicFrame)udata; if (frame.cur_frameid < this.sync_frameid) { Debug.LogError(frame.cur_frameid); return; } //同步上一帧逻辑操作, 调整我们的位置,调整完以后。 客户端同步到的是 sync_frame if (this.last_frame_opts != null) //同步到正确的点 { this.on_sync_last_logic_frame(this.last_frame_opts); } //end //从sync_frame 开始 ----> frame.frameid -1 //同步丢失的帧 for (int i = 0; i < frame.unsync_frames.Count; i++) { // Debug.LogError(this.sync_frameid + ":" + frame.unsync_frames[i].old_frameid); if (this.sync_frameid >= frame.unsync_frames[i].old_frameid) { continue; } else if (frame.unsync_frames[i].old_frameid >= frame.cur_frameid) { break; } this.on_handler_frame_event(frame.unsync_frames[i]); this.upgrade_exp_by_time(); } //end //获取最后一个操作, frame.frameid 操作,根据这个操作,来处理,来播放动画 this.sync_frameid = frame.cur_frameid; if (frame.unsync_frames.Count > 0) { this.last_frame_opts = frame.unsync_frames[frame.unsync_frames.Count - 1]; this.on_handler_frame_event(this.last_frame_opts); this.upgrade_exp_by_time(); } else { this.last_frame_opts = null; } //end //采集下一个帧的事件,发送给服务器 this.capture_player_opts(); //end }
/// <summary> /// 帧同步调度主函数 /// </summary> /// <param name="eventName"></param> /// <param name="udata"></param> private void OnLogicUpdate(string eventName, object udata) { LogicFrame frame = (LogicFrame)udata; if (frame.frameid < this._syncFrameID)//收到以前发来的操作帧,直接忽略 { return; } //同步自己客户端上一帧的逻辑操作,调整位置到真实位置: //调整完以后,客户端同步到syncFrameID if (this._lastFrameOpts != null) { OnSyncLastLogicFrame(this._lastFrameOpts); //此时,所有玩家的位置都同步到了正确的位置。 } //从syncFrameID+1开始-->frame.frameid-1 //同步丢失的帧,快速同步到当前帧 //所有客户端的数据都被同步到frame.frameid-1 for (int i = 0; i < frame.unsync_frames.Count; i++) { if (this._syncFrameID >= frame.unsync_frames[i].frameid) { continue; } if (frame.unsync_frames[i].frameid >= frame.frameid) { break; } OnHandlerFrameEvent(frame.unsync_frames[i]);//更新动画状态 UpgradeExpByTime(); } //获取最后一个操作 frame.frameid的操作 //根据这个操作来处理,播放动画,产生的位移为“假位移” this._syncFrameID = frame.frameid;//同步到的事件帧ID if (frame.unsync_frames.Count > 0) { this._lastFrameOpts = frame.unsync_frames[frame.unsync_frames.Count - 1]; OnHandlerFrameEvent(this._lastFrameOpts);//更新动画状态 UpgradeExpByTime(); } else { _lastFrameOpts = null; } //采集下一个帧的事件,发送给服务器 CapturePlayerOpts(); }
private void OnSyncLastLogicFrame(FrameOpts frameOpts) { //把所有玩家的操作进行数据同步,同步的时间间隔(逻辑帧的时间间隔) for (int i = 0; i < frameOpts.opts.Count; i++) { int seatid = frameOpts.opts[i].seatid; Hero h = GetHeroBySeatID(seatid); if (h == null) { Debug.LogError("cannot find hero by seatid: " + seatid); continue; } h.OnSyncLastLogicFrame(frameOpts.opts[i]); } }
void on_handler_frame_event(FrameOpts frame) { //把所有英雄的输入进行处理 for (int i = 0; i < frame.opts.Count; i++) { //这里暂时只管玩家自己的英雄 if (frame.opts[i].seatid == ugames.Instance.self_seatid) { this.test_hero.on_handler_frame_event(frame.opts[i]); } } //end //怪物AI 根据我们的处理,来进行处理... //end }
private void on_sync_last_logic_frame(FrameOpts frame_opt) { //把所有英雄的输入进行处理 //同步的时间间隔就是 逻辑帧的时间间隔 for (int i = 0; i < frame_opt.opts.Count; i++) { int seatid = frame_opt.opts[i].seatid; hero h = this.get_hero(seatid); if (!h) { Debug.LogError("cannot find here: " + seatid); continue; } h.on_sync_last_logic_frame(frame_opt.opts[i]); } }
/// <summary> /// 开启逻辑帧事件 /// </summary> /// <param name="source"></param> /// <param name="e"></param> public void OnLogicFrame(object source, ElapsedEventArgs e) { currentTime += m_fFrameLen * 1000; //5秒后执行事件 if (currentTime > 1000 + m_fFrameLen * 1000) { //保存上一帧的数据 matchFrames.Add(nextFrameOpt); //发送当前帧的数据给所有玩家 for (int i = 0; i < players.Count; i++) { SendUnsyncFrames(players[i]); } frameId++; //设置下一帧,并等待客户端发来的帧数据 nextFrameOpt = new FrameOpts(); } }
void evt_logic_frame_update(string name, object udata) { LogicFrame frame = (LogicFrame)udata; if (frame.frameid < this.sync_frameid) { return; } /* * Debug.Log(frame.unsyncFrames.Count); * for (int i = 0; i < frame.unsyncFrames.Count; i++) * { * for (int j = 0; j < frame.unsyncFrames[i].opts.Count; j++) * { * Debug.Log(frame.unsyncFrames[i].opts[i].x + "------------------:--------------------" + frame.unsyncFrames[i].opts[i].y); * } * }*/ //同步自己客户端上一帧逻辑操作,调整我们的位置;调整完成后,客户端同步的是sync_frameid //end //从sync_frameid+1开始----------------》frame.frameid-1; //同步丢失的帧,所有的客户端数据同步到 frame.frameid-1 //end //获取最后一个操作,frame.frameid操作,根据这个操作来处理播放动画 this.sync_frameid = frame.frameid;//同步到的事件帧id if (frame.unsyncFrames.Count > 0) { this.last_frame_opt = frame.unsyncFrames[frame.unsyncFrames.Count - 1]; this.on_handler_frame_event(this.last_frame_opt); } else { this.last_frame_opt = null; } //end //采集下一个帧的事件,发送给服务器 //采集玩家当前的操作帧 this.capture_player_opts(); }
private void on_handler_frame_event(FrameOpts frame_opt) { //调用英雄的logic_update this.on_frame_handle_hero_logic(); //end //把所有玩家的操作带入进去 for (int i = 0; i < frame_opt.opts.Count; i++) { int seatid = frame_opt.opts[i].seatid; hero h = this.get_hero(seatid); if (!h) { Debug.LogError("cannot find here: " + seatid); continue; } h.on_handler_frame_event(frame_opt.opts[i]); } //end //小兵位置 this.on_frame_handle_monster_logic(); //end //子弹逻辑先迭代 this.on_frame_handle_tower_bullet_logic(); //end // 塔的 AI 根据我们的处理,来进行处理... this.on_frame_handle_tower_logic(); //end // 同步小兵的AI this.on_frame_handle_monster_ai(); // end //产生怪物 this.gen_moster(); //end }
public void Init() { m_fFrameLen = 0.066f; matchFrames = new List <FrameOpts>(); nextFrameOpt = new FrameOpts(); }