예제 #1
0
    protected override ServerFrameMsg createServerFrameMsg()
    {
        ServerFrameMsg serverEvent = new ServerFrameMsg();

        serverEvent.frameNum = serverCurrentFrameNum;

        events.Clear();
        List <ClientFrameMsg> clientMsgs = InputEventTranslator.instance.translateInputToEvent();

        if (clientMsgs != null)
        {
            for (int i = 0; i < clientMsgs.Count; ++i)
            {
                ServerFrameInputEvent sie = new ServerFrameInputEvent();
                sie.angle    = clientMsgs[i].angle;
                sie.keys[0]  = clientMsgs[i].keys[0];
                sie.keys[1]  = clientMsgs[i].keys[1];
                sie.objectID = 1;
                events.Add(sie);
            }
        }

        serverEvent.events = events;

        ++serverCurrentFrameNum;

        return(serverEvent);
    }
예제 #2
0
    public void runLogic(float time)
    {
        //
        for (int i = 0; i < logicUpdators.Count; ++i)
        {
            logicUpdators[i].preUpdate();
        }

        ServerFrameMsg currentFrameInputEvent = popFrameInputEvent();

        if (frameSyncEventHandler != null)
        {
            for (int i = 0; i < currentFrameInputEvent.events.Count; ++i)
            {
                ServerFrameInputEvent playerInputEvent = currentFrameInputEvent.events[i];

                frameSyncEventHandler.handleFrameInputEvent(playerInputEvent);
            }
        }

        //Debuger.Log("current frame num " + currentFrameInputEvent.frameNum);
        //丢帧????
        if (currentFrameInputEvent.frameNum  != 0 && currentFrameInputEvent.frameNum != (currentLogicFrameNum + 1))
        {
            Debuger.LogError("!!!!!!!!!!!!!!!!LostFrame: " + (currentLogicFrameNum + 1) + " ,currentFrameNum " + currentFrameInputEvent.frameNum);
        }

        currentLogicFrameNum = currentFrameInputEvent.frameNum;

        for (int i = 0; i < logicUpdators.Count; ++i)
        {
            logicUpdators[i].update(time);
        }
    }
예제 #3
0
    protected virtual ServerFrameMsg createServerFrameMsg()
    {
        ServerFrameMsg serverEvent = new ServerFrameMsg();

        serverEvent.frameNum = serverCurrentFrameNum;

        ++serverCurrentFrameNum;

        return(serverEvent);
    }
예제 #4
0
    //更新一帧
    public void updateFrame(ServerFrameMsg cmd, float time)
    {
        if (frameSync == null)
        {
            return;
        }

        frameSync.pushFrameInputEvent(cmd);
        frameSync.udpateFrame(time);
    }
예제 #5
0
    ServerFrameMsg popServerMessage()
    {
        if (serverMessages.Count == 0)
        {
            return(null);
        }
        ServerFrameMsg msg = serverMessages.First.Value;

        serverMessages.RemoveFirst();
        return(msg);
    }
예제 #6
0
    public ServerFrameMsg popFrameInputEvent()
    {
        if (serverFrameInputEventList.Count == 0)
        {
            return(null);
        }
        ServerFrameMsg fie = serverFrameInputEventList[0];

        serverFrameInputEventList.RemoveAt(0);

        return(fie);
    }
예제 #7
0
    public override bool unMarshal(BytesStream stream)
    {
        var frameCount = stream.ReadUInt16();

        while (stream.Pos < stream.Buf.Length - 1 && allFrameMessages.Count < frameCount)
        {
            ServerFrameMsg evt = new ServerFrameMsg();
            evt.unMarshal(stream);
            allFrameMessages.Add(evt);
        }

        return(true);
    }
예제 #8
0
    public void onServerFrameMsg(ServerFrameMsg cmd)
    {
        if (!Game.instance.fbGame.frameSync.frameSyncStarted)
        {
            Game.instance.fbGame.frameSync.start();
        }

        if (Game.instance.fbGame.frameSyncUpdater.thisType != FrameSyncUpdater.type)
        {
            return;
        }

        Game.instance.fbGame.frameSyncUpdater.updateFrame(cmd, UnityEngine.Time.realtimeSinceStartup);

#if FRAME_RECORDING
        if (FrameRecording.instance != null)
        {
            FrameRecording.instance.pushServerMessage(cmd);
        }
#endif
    }
예제 #9
0
    public void run()
    {
        if (_stopped)
        {
            return;
        }

        var frameSyncTime = Time.unscaledTime - frameSyncTimeOrigin;

        var currentFrameNum = (int)(frameSyncTime * 15);

        for (int i = lastFrameNum; i < currentFrameNum; ++i)
        {
            ServerFrameMsg serverFrameMsg = createServerFrameMsg();

            //updateFrame(serverFrameMsg,Game.instance.logicFrameQueue.nextFrameId / (float)FrameSync.LOGIC_FPS);
            updateFrame(serverFrameMsg, Time.realtimeSinceStartup);
        }
        var d = currentFrameNum - lastFrameNum;

        count       += d;
        lastFrameNum = currentFrameNum;
    }
예제 #10
0
    IEnumerator simulateServerMessage()
    {
        fbGame.debugLogicStart();

        while (true)
        {
            for (int i = 0; i < (int)PlaySpeed; ++i)
            {
                ServerFrameMsg serverMsg = popServerMessage();
                if (serverMsg == null)
                {
                    yield break;
                }

                fbGame.frameSync.pushFrameInputEvent(serverMsg);
                fbGame.frameSync.udpateFrame(Time.unscaledTime);

                fbGame.debugFrameLogic();
            }

            yield return(new WaitForSeconds((float)FrameSync.LOGIC_UPDATE_TIME));
        }
    }
예제 #11
0
 public void updateFrame(ServerFrameMsg cmd, float time)
 {
     frameUpdator.updateFrame(cmd, time);
 }
예제 #12
0
 //插入一个帧输入事件,从网络层收到的帧同步消息通过该接口插入到列表中去
 public void pushFrameInputEvent(ServerFrameMsg fie)
 {
     serverFrameInputEventList.Add(fie);
 }
예제 #13
0
    public void process(byte[] msg)
    {
        if (InstanceManager.instance.playerManager.myPlayerInfo == null)
        {
            return;
        }

        if (!InstanceManager.instance.playerManager.myPlayerInfo.isEnterBattleScene)
        {
            return;
        }


        if (!SceneUtil.InBattleScene())
        {
            return;
        }


        string str = System.Text.Encoding.Default.GetString(msg);

        ServerFrameMsg serverFrame = InstanceManager.instance.jsonManager.Deserialize <ServerFrameMsg>(str);


        // Debug.Log(" receieve serverFrame ...... " + serverFrame.playerFrameMsgs.Count);



        foreach (PlayerFrameMsg playerFrameMsg in serverFrame.playerFrameMsgs)
        {
            if (playerFrameMsg.playerId == InstanceManager.instance.playerManager.myPlayerInfo.id)
            {
                continue;
            }

            PlayerInfo playerInfo = InstanceManager.instance.playerManager.GetPlayerInfo(playerFrameMsg.playerId);
            if (playerInfo == null)
            {
                GameObject gameObject = GameObject.Instantiate(InstanceManager.instance.prefabManager.enemyPrefab);


                gameObject.SetActive(true);

                playerInfo            = new PlayerInfo();
                playerInfo.id         = playerFrameMsg.playerId;
                playerInfo.gameObject = gameObject;

                gameObject.name = "Enemy_" + playerFrameMsg.name;


                InstanceManager.instance.playerManager.PutPlayerInfo(playerInfo);


                Debug.Log(" create enemy ");
            }



            if (playerInfo.bullet == null)
            {
                playerInfo.bullet = GameObject.Instantiate(InstanceManager.instance.prefabManager.enemyBulletPrefab);
            }


            if (playerFrameMsg.bulletPosi != null)
            {
                playerInfo.bullet.transform.position = new Vector3(playerFrameMsg.bulletPosi.x, playerFrameMsg.bulletPosi.y, 0);
            }

            if (playerFrameMsg.bulletActive)
            {
                playerInfo.bullet.SetActive(true);
            }
            else
            {
                playerInfo.bullet.SetActive(false);
            }


            playerInfo.gameObject.GetComponent <Transform>().position = new Vector3(playerFrameMsg.posi.x, playerFrameMsg.posi.y, 0);
        }
    }
예제 #14
0
 public void pushServerMessage(ServerFrameMsg cmd)
 {
     serverMessages.AddLast(cmd);
 }