/// <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();
    }
Beispiel #2
0
    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]);
        }
    }
Beispiel #8
0
    /// <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
    }
Beispiel #11
0
 public void Init()
 {
     m_fFrameLen  = 0.066f;
     matchFrames  = new List <FrameOpts>();
     nextFrameOpt = new FrameOpts();
 }