Пример #1
0
    //取下一帧执行
    public FrameInfo NextTurn()
    {
        if (headIdx == -1)
        {
            return(null);
        }
        FrameInfo turn = null;

        turn = turnQ[headIdx];
        if (turn == null)
        {
            if (tailIdx > headIdx)  //缺帧,请求重发。否则只是新的帧还未到
            {
                GameMsgSender.SendMissTurnReq((uint)curExecTurnID + 1);
            }
        }
        else
        {
            if (turn.frameNum != curExecTurnID + 1)
            {
                Debug.LogError("turn.frameNum != curExecTurnID + 1, Impossible!");
            }
            turnQ[headIdx] = null;
            headIdx        = WrapIncIndex(headIdx, 1);
            curExecTurnID  = (int)turn.frameNum;
        }
        return(turn);
    }
Пример #2
0
    public void ReadInput()
    {
        float     hori = Input.GetAxis("Horizontal");
        float     vert = Input.GetAxis("Vertical");
        Direction dir  = ConvertToDirection(hori, vert);

        Command cmd = Command.None;

        if (Input.GetKey(KeyCode.J))
        {
            cmd = Command.Action1;
        }
        else if (Input.GetKey(KeyCode.K))
        {
            cmd = Command.Action2;
        }
        else if (Input.GetKey(KeyCode.L))
        {
            cmd = Command.Action3;
        }

        if (curCmd != cmd || curDir != dir)
        {
            //Logger.Log("SendInput " + dir + " " + cmd);
            GameMsgSender.SendInput(dir, cmd);
        }
        curCmd = cmd;
        curDir = dir;
    }
Пример #3
0
    void SendClientEndGame1Plus()
    {
        TeamMatchData matchData = new TeamMatchData();

        matchData.acc_id = MainPlayer.Instance.AccountID;
        PlayerMatchData homeData = new PlayerMatchData();

        homeData.acc_id    = m_match.m_homeTeam.GetMember(0).m_roleInfo.acc_id;
        homeData.exit_type = ExitMatchType.EMT_END;
        matchData.player_data.Add(homeData);
        foreach (Player player in m_match.m_homeTeam)
        {
            matchData.role_data.Add(player.mStatistics.data);
        }
        PlayerMatchData awayData = new PlayerMatchData();

        awayData.acc_id    = m_match.m_awayTeam.GetMember(0).m_roleInfo.acc_id;
        awayData.exit_type = ExitMatchType.EMT_END;
        matchData.player_data.Add(awayData);
        foreach (Player player in m_match.m_awayTeam)
        {
            matchData.role_data.Add(player.mStatistics.data);
        }
        GameMsgSender.SendTeamMatchData(matchData);
    }
Пример #4
0
    public void SendTurnCheckData()
    {
        CheckFrame turnData = new CheckFrame();

        turnData.frameNum = (uint)curExecTurnID;
        foreach (Player player in GameSystem.Instance.mClient.mPlayerManager)
        {
            RoleKeyState data = new RoleKeyState();
            data.index      = player.m_roleInfo.index;
            data.position   = GameUtils.Convert(player.position);
            data.hori_angle = player.rotation.eulerAngles.y.raw;
            PlayerState curState = player.m_StateMachine.m_curState;
            data.state = curState != null ? (int)curState.m_eState : 0;
            turnData.roleDatas.Add(data);
        }
        foreach (UBasketball ball in GameSystem.Instance.mClient.mCurMatch.mCurScene.balls)
        {
            BallKeyState data = new BallKeyState();
            data.index    = ball.m_id;
            data.position = GameUtils.Convert(ball.position);
            data.state    = (int)ball.m_ballState;
            turnData.ballDatas.Add(data);
        }
        checkData.Enqueue(turnData);
        while (checkData.Count > 20)
        {
            checkData.Dequeue();
        }
        GameMsgSender.SendTurnCheckData(turnData);
    }
Пример #5
0
    void OnClickMsg(GameObject go)
    {
        if (go == goShortMsgFolder)
        {
            m_bShowAll = !m_bShowAll;
            TweenRotation.Begin(goShortMsgFolder, 0.2f, Quaternion.AngleAxis(m_bShowAll ? 0.0f : 90.0f, new Vector3(0.0f, 0.0f, 1.0f))).method = UITweener.Method.EaseOut;
            return;
        }

        MatchMsgBtn msgBtn = m_matchMsgBtns.Find((MatchMsgBtn matchBtn) => { return(matchBtn.btn == go); });

        if (msgBtn == null)
        {
            return;
        }
        if (!msgBtn.valid)
        {
            return;
        }
        if (go == goCustomMsg)
        {
            m_bShowCustomMsg = !m_bShowCustomMsg;
            return;
        }

        foreach (MatchMsgBtn btn in m_matchMsgBtns)
        {
            btn.Reset(msgBtn.msg.cd);
        }
        m_bShowCustomMsg = false;
        GameMsgSender.SendGameShortMsg(m_match.mainRole, msgBtn.msg.id, (uint)msgBtn.msg.recvType);
    }
Пример #6
0
    protected override void _OnLoadingCompleteImp()
    {
        base._OnLoadingCompleteImp();
        mCurScene.CreateBall();

        if (m_config == null)
        {
            Debug.LogError("Match config file loading failed.");
            return;
        }

        mainRole                  = GameSystem.Instance.mClient.mPlayerManager.GetPlayerById(uint.Parse(m_config.MainRole.id));
        mainRole.operMode         = Player.OperMode.Input;
        mainRole.m_InfoVisualizer = new PlayerInfoVisualizer(mainRole);
        mainRole.m_team.m_role    = GameMatch.MatchRole.eOffense;
        mainRole.position         = GameSystem.Instance.MatchPointsConfig.BeginPos.offenses_transform[0].position;
        mainRole.GrabBall(mCurScene.mBall);

        _UpdateCamera(mainRole);

        _CreateGUI();

        GameMsgSender.SendGameBegin();

        mCurScene.mBasket.onGoal = OnGoal;
    }
Пример #7
0
 void _OnTimer()
 {
     GameMsgSender.SendTimeTracer(m_msgId, m_curTime, m_server);
     m_msgId++;
     if (m_msgId > 10000)
     {
         m_msgId = 0;
     }
 }
Пример #8
0
    void FixedUpdate()
    {
        //计数回合内逻辑帧(服务器进度)
        acumulativeTimeServer += Time.fixedDeltaTime * 1000;
        if (acumulativeTimeServer >= GAME_UPDATE_LENGTH)
        {
            acumulativeTimeServer -= GAME_UPDATE_LENGTH;
            ++gameUpdateIndexInTurnServer;
        }

        //如果预测平均回合间隔将大于定义回合间隔,则可能出现等回合。通过减慢逻辑帧速度,平滑等帧的卡顿
        float turnInterval = TurnManager.Instance.averageTurnInterval;

        if (turnInterval > ((float)TURN_LENGTH / 1000 + 0.2f))
        {
            float factor = turnInterval / ((float)TURN_LENGTH / 1000);
            //Logger.Log("Scale exactGameUpdateLength: " + factor);
            exactGameUpdateLength = exactGameUpdateLength * factor;
        }
        //执行逻辑帧
        acumulativeTime += Time.fixedDeltaTime * 1000;
        if (acumulativeTime >= exactGameUpdateLength)
        {
            acumulativeTime -= exactGameUpdateLength;

            //计算需执行的逻辑帧数量(叠帧)
            int gameUpdateNum = CalcGameUpdateNumPerLoop();
            for (int i = 0; i < gameUpdateNum && pendingGameUpdateNum > 0; ++i)
            {
                //处理回合
                bool toProcessTurn = (Game.Instance.CurFrame % GAME_UPDATE_PER_TURN == 0);
                if (toProcessTurn)
                {
                    FrameInfo nextTurn = TurnManager.Instance.NextTurn();
                    if (nextTurn == null)   //等回合,不执行逻辑帧
                    {
                        break;
                    }
                    Game.Instance.ProcessTurn(nextTurn);
                }

                //Logger.Log("Turn:" + TurnManager.Instance.CurTurnID + " GameUpdate:" + Game.Instance.CurFrame +
                //    " PendingGameUpdateNum:" + pendingGameUpdateNum);
                //执行逻辑帧
                Game.Instance.Update(GAME_UPDATE_LENGTH);
                //发送关键数据校验
                if (toProcessTurn)
                {
                    GameMsgSender.SendTurnValidate(Game.Instance.playerInfos);
                }

                --pendingGameUpdateNum;
            }
        }

        NetworkManager.Instance.FixedUpdate(Time.fixedDeltaTime);
    }
Пример #9
0
 void OnServerConnected(NetworkConn.Type type)
 {
     if (type == NetworkConn.Type.eGameServer)
     {
         Logger.Log("Server connected.");
         GameMsgSender.SendEnterPlat();
         Object.Destroy(gameObject);
     }
 }
Пример #10
0
    public void OnSceneLoaded()
    {
        if (pvp)
        {
            GameMsgSender.SendPVPLoadProgress(50);
        }
        else
        {
            _RefreshUIPercFunc(50);
        }

        m_curLoadingStep = LoadingStep.eLoadedScene;
    }
Пример #11
0
    //新的一帧到来
    public void NewTurn(PlayFrame playFrame)
    {
        if (headIdx == -1)
        {
            headIdx = 0;
        }
        //计算需求的空间
        int maxTurnID = (int)playFrame.frames[playFrame.frames.Count - 1].frameNum;
        int turnNum   = maxTurnID - curExecTurnID;

        if (turnNum > turnQ.Capacity) //当前turnQ空间已经存不下,分配更多空间
        {
            ReallocTurnQ(turnNum);
        }
        foreach (FrameInfo turn in playFrame.frames)
        {
            int turnID = (int)turn.frameNum;
            int diff   = turnID - curServerTurnID;    //帧编号差距
            int index  = WrapIncIndex(tailIdx, diff); //安放位置
            turnQ[index] = turn;                      //安放
            if (diff > 1)                             //丢包,请求重发
            {
                List <uint> missedTurnIDs = new List <uint>();
                for (int i = curServerTurnID + 1; i < turnID; ++i)
                {
                    missedTurnIDs.Add((uint)i);
                }
                GameMsgSender.SendMissTurnReq(missedTurnIDs);
            }
            if (diff > 0)   //非补帧
            {
                tailIdx         = index;
                curServerTurnID = (int)turn.frameNum;
            }
            //Logger.Log("Receive new turn: " + info.frameNum + " " + Time.time);

            /*
             * foreach (ClientInput input in turn.info)
             * {
             *  Logger.Log(string.Format("New turn:{0} Acc:{1} Dir:{2} Cmd:{3}",
             * //        Logger.Log("Input: " + input.acc_id + " " + input.dir + " " + input.cmd);
             * }
             * //*/
            //通知
            if (onNewTurn != null)
            {
                onNewTurn(turn);
            }
        }
        CalcAverageTurnInterval(Time.time);
    }
Пример #12
0
    public override void ViewUpdate()
    {
        base.ViewUpdate();

        if (!GameSystem.Instance.mClient.mUIManager.isInMatchLoading && m_uiController == null)
        {
            _CreateGUI();
            PostCreateUI();

            practise_behaviour.match    = this;
            practise_behaviour.practise = practise;

            GameMsgSender.SendGameBegin();
        }
    }
Пример #13
0
    void SendClientEndGame3V3()
    {
        TeamMatchData matchData = new TeamMatchData();

        matchData.acc_id = MainPlayer.Instance.AccountID;
        foreach (Player player in GameSystem.Instance.mClient.mPlayerManager)
        {
            PlayerMatchData accData = new PlayerMatchData();
            accData.acc_id    = player.m_roleInfo.acc_id;
            accData.exit_type = ExitMatchType.EMT_END;
            matchData.player_data.Add(accData);
            matchData.role_data.Add(player.mStatistics.data);
        }
        GameMsgSender.SendTeamMatchData(matchData);
    }
Пример #14
0
    void OnHandleMatchBeginTimer()
    {
        Debug.Log("match begin.");
        NetworkConn conn = GameSystem.Instance.mNetworkManager.m_gameConn;

        if (conn == null || conn is VirtualNetworkConn || m_matchBeginPack == null)
        {
            return;
        }
        GameSystem.Instance.mNetworkManager.m_gameMsgHandler.UnregisterHandler(MsgID.MatchBeginID, HandleMatchBegin);
        //conn.m_handler.UnregisterHandler(MsgID.PVPLoadCompleteRespID, HandleLoadComplete);

        MatchBegin resp = Serializer.Deserialize <MatchBegin>(new MemoryStream(m_matchBeginPack.buffer));

        if (resp == null)
        {
            Debug.LogError("no pvp loading complete resp");
            return;
        }

        //close ui
        foreach (KeyValuePair <uint, List <LuaComponent> > items in mapPlayerIdLoadingState)
        {
            items.Value.Clear();
        }
        mapPlayerIdLoadingState.Clear();

        GameSystem.Instance.mClient.pause = false;


        GameMatch_PVP match = GameSystem.Instance.mClient.mCurMatch as GameMatch_PVP;

        match.OnInitPlayer();

        if (MainPlayer.Instance.inPvpJoining)
        {
            GameMsgSender.SendGameBegin();
            m_delayDestroy = true;
        }
        else
        {
            match.m_stateMachine.SetState(MatchState.State.eOpening);
            Object.Destroy(gameObject);
        }
    }
Пример #15
0
    public void Update(GameMatch match)
    {
        if (!enabled)
        {
            _UpdateValidCommand(match);
            return;
        }

        _UpdateValidCommand(match);
        InputDirection dir = ConvertToDirection(GameSystem.Instance.mClient.mInputManager.mHVDirection);

        Command cmd = Command.None;

        if (match.m_uiController == null)
        {
            return;
        }
        if (GameSystem.Instance.mClient.mInputManager.m_CmdBtn1Click &&
            match.m_uiController.m_btns[0].cmd != Command.None)
        {
            cmd = match.m_uiController.m_btns[0].cmd;
        }
        else if (GameSystem.Instance.mClient.mInputManager.m_CmdBtn2Click &&
                 match.m_uiController.m_btns[1].cmd != Command.None)
        {
            cmd = match.m_uiController.m_btns[1].cmd;
        }
        else if (GameSystem.Instance.mClient.mInputManager.m_CmdBtn3Click &&
                 match.m_uiController.m_btns[2].cmd != Command.None)
        {
            cmd = match.m_uiController.m_btns[2].cmd;
        }
        else if (GameSystem.Instance.mClient.mInputManager.m_CmdBtn4Click &&
                 match.m_uiController.m_btns[3].cmd != Command.None)
        {
            cmd = match.m_uiController.m_btns[3].cmd;
        }

        if (curCmd != cmd || curDir != dir)
        {
            GameMsgSender.SendInput(dir, cmd);
        }
        curCmd = cmd;
        curDir = dir;
    }
Пример #16
0
    private IEnumerator _LoadUi(List <string> uiNames)
    {
        yield return(new WaitForSeconds(1.5f));

        for (int i = 0; i < uiNames.Count; i++)
        {
            ResourceLoadManager.Instance.LoadPrefab(uiNames[i]);
        }

        if (pvp)
        {
            GameMsgSender.SendPVPLoadProgress((uint)20);
        }
        else
        {
            _RefreshUIPercFunc(20);
        }
        m_curLoadingStep = LoadingStep.eLoadedUI;
        Debug.Log("Load ui.");
    }
Пример #17
0
    private IEnumerator _LoadCharacters(PlayerManager pm, GameMatch match)
    {
        yield return(new WaitForSeconds(1.5f));

        if (pvp)
        {
            GameMatch_PVP match_pvp = match as GameMatch_PVP;
            match_pvp.LoadPlayers();
            GameMsgSender.SendPVPLoadProgress(30);
        }
        else
        {
            foreach (Player player in pm)
            {
                GameSystem.Instance.mClient.mCurMatch.CreateTeamMember(player);
            }
            _RefreshUIPercFunc(30);
        }
        m_curLoadingStep = LoadingStep.eLoadedPlayers;
        Debug.Log("Load character.");
    }
Пример #18
0
    public void OnGameBegin(GameBeginReq req)
    {
        if (running)
        {
            return;
        }

        ClientInput input = new ClientInput();

        input.acc_id           = req.acc_id;
        lastInputs[req.acc_id] = input;

        ++readyPlayerNum;
        if (readyPlayerNum >= playerNum)
        {
            running = true;
            GameBeginResp resp = new GameBeginResp();
            resp.seed = (uint)IM.Random.Range(0L, (long)uint.MaxValue);
            GameMsgSender.SendGameBeginResp(resp);
        }
    }
Пример #19
0
    void NewTurn()
    {
        FrameInfo turn = new FrameInfo();

        turn.frameNum = curTurnID++;
        foreach (KeyValuePair <uint, ClientInput> pair in lastInputs)
        {
            ClientInput input = new ClientInput();
            input.acc_id = pair.Value.acc_id;
            input.dir    = pair.Value.dir;
            input.cmd    = pair.Value.cmd;
            turn.info.Add(input);
        }
        turn.time = Time.time;
        PlayFrame playFrame = new PlayFrame();

        playFrame.frames.Add(turn);

        turns.Add(turn);
        GameMsgSender.SendTurn(playFrame);
    }
Пример #20
0
 void HandleEnterPlatResp(Pack pack)
 {
     GameMsgSender.SendGameBegin();
 }
Пример #21
0
    void Update()
    {
        for (int i = updatePreclist.Count - 1; i >= 0; i--)
        {
            UpdatePrec up = updatePreclist[i];
            up.curTime += Time.deltaTime;
            if (up.curTime > updatePreclist[i].targetTime)
            {
                up.PrecValue--;
                up.curTime = 0.0f;
                up.loadingItem.percentage++;
                LuaComponent loadingItem = up.loadingItem.transform.GetComponent <LuaComponent>();
                if (loadingItem.table != null)
                {
                    loadingItem.table.Set("loadingState", CommonFunction.GetConstString("STR_LOADING") + up.loadingItem.percentage + "%");
                }
            }
            if (up.PrecValue == 0)
            {
                if (m_curLoadingCmd != null)
                {
                    if (up.loadingItem.ri != null)
                    {
                        if (up.loadingItem.ri.acc_id == MainPlayer.Instance.AccountID)
                        {
                            m_curLoadingCmd.m_bDone = true;
                        }
                    }
                    else
                    {
                        m_curLoadingCmd.m_bDone = true;
                    }
                }

                updatePreclist.RemoveAt(i);
            }
        }

        _InitGameMsgHandler();

        //loading queue process
        if (m_curLoadingCmd == null && m_loadingQueue.Count != 0)
        {
            m_curLoadingCmd = m_loadingQueue.Dequeue();
            m_curLoadingCmd.Execute();
        }
        if (m_curLoadingCmd != null && m_curLoadingCmd.m_bDone)
        {
            if (m_curLoadingCmd.m_bFinalCmd)
            {
                m_curLoadingStep = LoadingStep.eLoadingComplete;
            }
            m_curLoadingCmd = null;
        }
        if (m_curLoadingStep == LoadingStep.eInit)
        {
            return;
        }

        if (m_wait != null)
        {
            m_wait.Update(Time.deltaTime);
        }

        GameMatch_PVP match = GameSystem.Instance.mClient.mCurMatch as GameMatch_PVP;

        if (match == null)
        {
            if (m_curLoadingStep == LoadingStep.eLoadingComplete)
            {
                if (onComplete != null)
                {
                    onComplete();
                }
                Object.Destroy(gameObject);
            }
        }
        else
        {
            if (m_curLoadingStep == LoadingStep.eLoadedScene && match.m_bPlayerDataReady && !m_pvpLoadPlayer)
            {
                LoadCharacter(GameSystem.Instance.mClient.mPlayerManager, match);
                m_pvpLoadPlayer = true;
            }

            if (m_curLoadingStep == LoadingStep.eLoadedPlayers && !m_pvpLoadUI)
            {
                LoadUI(match);
                m_pvpLoadUI = true;
            }

            if (m_curLoadingStep == LoadingStep.eLoadingComplete && !m_pvpLoadComplete)
            {
                if (onComplete != null)
                {
                    onComplete();
                }
                m_pvpLoadComplete = true;
                GameMsgSender.SendLoadingComplete(match.GetMatchType());
            }

            if (m_curLoadingStep == LoadingStep.eLoadingComplete && disConnected)
            {
                disConnected = false;
                ShowOffLine();
            }

            if (m_delayDestroy && !MainPlayer.Instance.inPvpJoining)
            {
//               if( m_delayLoadLua != null)
//               {
//                   m_delayLoadLua.ForEach((LuaComponent item) =>
//                                 {
//                                     item.table.Set("loadingState", CommonFunction.GetConstString("STR_LOAD_COMPLETE"));
//                                     item.table.Set("loadDone", true);
//                                 });

//               }
                Object.Destroy(gameObject);
            }
        }
    }