




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最后一站源码研究之匹配战斗(二)前面一站我们已经客户端发送进入战斗的请求消息给服务器,这个消息包含1. 客户端的时间2. 战斗id在服务器里面收到这个消息,就开始异步的SSBattle。这时才是真正的进入战斗,注意了在最后一站中,进入选择英雄房间就已经算是在一个Battle里面了。紧接着服务器就发送给客户端该玩家拥有的英雄列表消息。eMsgToGCFromGS_NotifyHeroList /eMsgToGCFromGS_NotifyHeroList Int32 OnNetMsg_NotifyHeroList(Stream stream) GSToGC.HeroList pMsg; if (!ProtoDes(out pMsg, stream) return PROTO_DESERIALIZE_ERROR; foreach (int heroId in pMsg.heroid) GameUserModel.Instance.CanChooseHeroList.Add(heroId); GameUserModel.Instance.STCTimeDiff = pMsg.timeDiff; /ss 和 client 时差 return (Int32)EErrorCode.eNormal; 可以看到这个消息有两个数据:1.List heroid/玩家拥有的英雄列表2.long timeDiff/服务器和客户端的时差,主要是同步更加准确 foreach (int heroId in pMsg.heroid) GameUserModel.Instance.CanChooseHeroList.Add(heroId); 就是初始化客户端的能选择的英雄列表。紧接着,服务器又发送了通知客户端战斗状态改变的消息,因为数据已经初始化完全了。eMsgToGCFromGS_NotifyBattleStateChange那么这里呢,战斗状态分为以下几个:public enum e_BattleState eBS_SelectHero = 0,/选择英雄 eBS_SelectRune,/选择符文 eBS_Loading,/加载界面 eBS_Playing,/战斗 eBS_Finished,/结束战斗肯定首先是选择英雄的状态。我们看看这条消息的具体处理。Int32 OnNetMsg_NotifyBattleStateChange(System.IO.Stream stream) GSToGC.BattleStateChange pMsg; if (!ProtoDes(out pMsg, stream) return PROTO_DESERIALIZE_ERROR; if (GameUserModel.Instance.IsReconnect) GameUserModel.Instance.IsReconnect = false; GameStateType curState = GameStateManager.Instance.GetCurState().GetStateType(); switch (e_BattleState)pMsg.state) case e_BattleState.eBS_SelectHero: HeroCtrl.Instance.SetSelectState(HeroCtrl.HeroSelectState.EnterSelect); EventCenter.SendEvent(new CEvent(EGameEvent.eGameEvent_IntoHero); EventCenter.Broadcast(EGameEvent.eGameEvent_HeroFirstTime, pMsg.statetimeleft); break; case e_BattleState.eBS_SelectRune: HeroCtrl.Instance.SetSelectState(HeroCtrl.HeroSelectState.EnterSelect); EventCenter.SendEvent(new CEvent(EGameEvent.eGameEvent_IntoHero); EventCenter.Broadcast(EGameEvent.eGameEvent_HeroSecondTime, pMsg.statetimeleft); HeroCtrl.Instance.SetSelectState(HeroCtrl.HeroSelectState.RandomSelect); break; case e_BattleState.eBS_Loading: if (curState GameStateType.GS_Loading) CGLCtrl_GameLogic.Instance.AskLoadComplete(); break; case e_BattleState.eBS_Playing: if (curState GameStateType.GS_Loading) CEvent evt2 = new CEvent(EGameEvent.eGameEvent_Loading); evt2.AddParam(NextState, BlGame.GameState.GameStateType.GS_Play); EventCenter.SendEvent(evt2); Debug.LogWarning(battle play ); else CGLCtrl_GameLogic.Instance.AskLoadComplete(); Debug.LogWarning(battle play but send loadcomplete!); break; case e_BattleState.eBS_Finished: EventCenter.Broadcast(EGameEvent.eGameEvent_BatttleFinished); break; else GameStateType curState = GameStateManager.Instance.GetCurState().GetStateType(); switch (e_BattleState)pMsg.state) case e_BattleState.eBS_SelectHero: if (JxBlGame.Instance.IsQuickBattle) EventCenter.SendEvent(new BlGame.CEvent(EGameEvent.eGameEvent_IntoHero); JxBlGame.Instance.IsQuickBattle = false; else EventCenter.Broadcast(EGameEvent.eGameEvent_RoomEnd); EventCenter.Broadcast(EGameEvent.eGameEvent_HeroFirstTime, pMsg.statetimeleft); break; case e_BattleState.eBS_SelectRune: EventCenter.Broadcast(EGameEvent.eGameEvent_HeroSecondTime, pMsg.statetimeleft); HeroCtrl.Instance.SetSelectState(HeroCtrl.HeroSelectState.RandomSelect); break; case e_BattleState.eBS_Loading: CEvent evt = new CEvent(EGameEvent.eGameEvent_Loading); evt.AddParam(NextState, BlGame.GameState.GameStateType.GS_Play); EventCenter.SendEvent(evt); break; case e_BattleState.eBS_Playing: if (curState GameStateType.GS_Play) CEvent evt = new CEvent(EGameEvent.eGameEvent_Loading); evt.AddParam(NextState, BlGame.GameState.GameStateType.GS_Play); EventCenter.SendEvent(evt); else /进入游戏 if (LoadScene.Instance != null) /进入游戏前需要强制清除界面贴图?资源 LoadScene.Instance.ReleaseResource(); LoadScene.Instance.CloseLoading(); break; case e_BattleState.eBS_Finished: if (curState GameStateType.GS_Play) if (LoadScene.Instance != null) LoadScene.Instance.CloseLoading(); CGLCtrl_GameLogic.Instance.EmsgToss_AskReEnterRoom(); break; return (Int32)EErrorCode.eNormal; 可以看到他分为重新连接和不是重新连接的处理,这里我们主要看看不是重新连接。因为第一个状态是选择英雄的状态: case e_BattleState.eBS_SelectHero: if (JxBlGame.Instance.IsQuickBattle) EventCenter.SendEvent(new BlGame.CEvent(EGameEvent.eGameEvent_IntoHero); JxBlGame.Instance.IsQuickBattle = false; else EventCenter.Broadcast(EGameEvent.eGameEvent_RoomEnd); EventCenter.Broadcast(EGameEvent.eGameEvent_HeroFirstTime, pMsg.statetimeleft); break;执行委托EGameEvent.eGameEvent_IntoHero case EGameEvent.eGameEvent_IntoHero: GameStateManager.Instance.ChangeGameStateTo(GameStateType.GS_Hero); break;可以看到他直接跳转游戏状态为:GameStateType.GS_Hero然后我们进入到这个状态看看代码: public void Enter() SetStateTo(GameStateType.GS_Continue); HeroCtrl.Instance.Enter(); ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.PATH_UIBGSOUND, ResourceType.ASSET); AudioClip clip = clipUnit.Asset as AudioClip; AudioManager.Instance.PlayBgAudio(clip); EventCenter.AddListener(EGameEvent.eGameEvent_Loading, OnEvent); EventCenter.AddListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail); EventCenter.AddListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff); 主要的执行代码是HeroCtrl.Instance.Enter(); public void Enter() HeroCtrl.Instance.SetSelectState(HeroCtrl.HeroSelectState.EnterSelect); EventCenter.Broadcast(EGameEvent.eGameEvent_HeroEnter); 这些处理主要是显示选择英雄的界面,然后播放选择英雄的背景音乐。再添加事件监听。这边处理完成之后,我们回到消息处理类,因为还有代码没有看完:case e_BattleState.eBS_SelectHero: if (JxBlGame.Instance.IsQuickBattle) EventCenter.SendEvent(new BlGame.CEvent(EGameEvent.eGameEvent_IntoHero); JxBlGame.Instance.IsQuickBattle = false; else EventCenter.Broadcast(EGameEvent.eGameEvent_RoomEnd); EventCenter.Broadcast(EGameEvent.eGameEvent_HeroFirstTime, pMsg.statetimeleft); break;这条委托,主要是初始化选择英雄的时间倒计时。EventCenter.Broadcast(EGameEvent.eGameEvent_HeroFirstTime, pMsg.statetimeleft);有人可能会问了,界面上应该没有英雄列表才是,注意了,在Show的时候,我找到了InitWeight()方法里面他已经加载英雄列表了。具体代码很多行,我就补贴出来,读者可以自行查看。OK,在这里界面都已经初始化完全了,所以接下来就是客户端的选择英雄操作了。当玩家选择一个英雄的时候,就发送消息:eMsgToGSToSSFromGC_AskTrySelectHero试图选择该英雄,因为我们还没有点击确定按钮,就跟LOL类型。 /预选?英?雄? /已?换?TryToSeleceHero /eMsgToGSToCSFromGC_TryToSelectHero public void EmsgTocs_TryToSelectHero(UInt32 heroId) GCToSS.TrySeleceHero pMsg = new GCToSS.TrySeleceHero heroid = heroId ; NetworkManager.Instance.SendMsg(pMsg, (int)pMsg.msgnum); 可以看到这个消息,他传递给服务器的是选择英雄的id。那么服务器接收到这条消息之后,就转发给其他房间内客户端(包括自己)。当然服务器处理不止这么简单,我只是大概说下处理,具体他里面还需要判断是否能选择该英雄等等。转发的消息为:eMsgToGCFromGS_NotifyTryToChooseHero Int32 OnNetMsg_NotifyToChooseHero(Stream stream) GSToGC.TryToChooseHero pMsg; if (!ProtoDes(out pMsg, stream) return PROTO_DESERIALIZE_ERROR; uint m_un8Seat = (uint)pMsg.pos; int heroId = pMsg.heroid; HeroCtrl.Instance.AddPreSelectHero(m_un8Seat, heroId); return (Int32)EErrorCode.eNormal; 这条消息呢有两个数据变量:1. pos /选择英雄的玩家座位号2. heroId /选择英雄的idpublic void AddPreSelectHero(uint index,int heroId)/玩家预选择英雄foreach(var item in PlayerManager.Instance.AccountDic.Values)if(index = item.GameUserSeat)if(heroSelectDic.ContainsKey(item)heroSelectDic.Remove(item);heroSelectDic.Add(item,heroId);break; EventCenter.Broadcast(EGameEvent.eGameEvent_HeroPreSelect); 前面部分的代码主要是更新预选字典缓存,heroSelectDic key=玩家,value=选择英雄的id后面则是更新界面的变化:public void UpdateHeroListSelect() /刷新选择列表 foreach (var pic in mSpriteBlackList) pic.gameObject.SetActive(false); foreach (var item in HeroCtrl.Instance.heroSelectDic.Keys) int heroId = 0; if (!HeroCtrl.Instance.heroSelectDic.TryGetValue(item, out heroId) continue; if (item.GameUserSeat != mLocalPlayer.GameUserSeat & mLocalPlayer.IsSameCamp(item) /找到?队友?所选?择?的?英?雄? int index = GetSelectIndexBuyHeroId(heroId); mSpriteBlackListindex.gameObject.SetActive(true); mSpriteDic(int)item.GameUserSeat - 1.spriteName = ConfigReader.GetHeroSelectInfo(heroId).HeroSelectHead.ToString(); if (item = PlayerManager.Instance.LocalAccount) mSpriteSelectDic(int)item.GameUserSeat - 1.spriteName = 329; if (!mSpriteSelectDic(int)item.GameUserSeat - 1.gameObject.activeInHierarchy) mSpriteSelectDic(int)item.GameUserSeat - 1.gameObject.SetActive(true); 这代码的主要处理是更新玩家选择英雄之后的界面变化。当其他玩家确认选择英雄的时候,服务器会向房间内所有的玩家发送一条消息:eMsgToGCFromGS_NotifyBattleHeroInfo我们看下消息处理的代码:/已?换?HeroInfo /eMsgToGCFromGS_NotifyBattleHeroInfo Int32 OnNetMsg_NotifyBattleHeroInfo(Stream stream) GSToGC.HeroInfo pMsg = ProtoBuf.Serializer.Deserialize(stream); if (null = pMsg) Debug.LogError(TODO Replace); return PROTO_DESERIALIZE_ERROR; HeroCtrl.Instance.AddRealSelectHero(uint)pMsg.heroposinfo.pos, pMsg.heroposinfo.heroid); /ToReview int-uint return (Int32)EErrorCode.eNormal; public void AddRealSelectHero(uint index,int heroId)/玩家确定英雄foreach(var item in PlayerManager.Instance.AccountDic.Values) if (index != item.GameUserSeat) continue; if(heroSelectDic.ContainsKey(item)heroSelectDic.Remove(item); if (index = PlayerManager.Instance.LocalAccount.GameUserSeat) if (selectState = HeroSelectState.RandomSelect) EventCenter.Broadcast(EGameEvent.eGameEvent_HeroRealSelect, heroId); else PlayLocalSelectSound(heroId); heroSureSelectDic.Add(item,heroId);heroSelectDic.Add(item,heroId);break; EventCenter.Broadcast(EGameEvent.eGameEvent_HeroAddSelect);这些代码实则就是更新玩家选择的缓存,更新界面,如果是玩家自己就播放选择英雄的音效。当你想要确定选择该英雄的时候,点击确定按钮,客户端就会发送:eMsgToGSToSSFromGC_AskSelectHero然后就会接受前面讲到的:eMsgToGCFromGS_NotifyBattleHeroInfo进入到选择皮肤和选择符文的界面,然后你可以选择符文发送给服务器选择符文的消息:eMsgToGSToSSFromGC_AskSelectRunePage然后服务器根据这条消息,自己的SSBattle战斗状态改变到e_BattleState.eBS_SelectRune选择符文的状态。然后发送给该玩家战斗状态改变的消息,当然状态值肯定是SelectRune:eMsgToGCFromGS_NotifyBattleStateChange客户端接收到: case e_BattleState.eBS_SelectRune: HeroCtrl.Instance.SetSelectState(HeroCtrl.HeroSelectState.EnterSelect); EventCenter.SendEvent(new CEvent(EGameEvent.eGameEvent_IntoHero); EventCenter.Broadcast(EGameEvent.eGameEvent_HeroSecondTime, pMsg.statetimeleft); HeroCtrl.Instance.SetSelectState(HeroCtrl.HeroSelectState.RandomSelect); break;这段代码主要是通知客户端选择符文的倒计时。客户端选择完成之后,其实服务器那边有开个计时器和客户端同步,如果倒计时一到,就进入下个战斗状态:e_BattleState.eBS_Loading加载状态。所以又会发送状态改变消息给所有玩家:eMsgToGCFromGS_NotifyBattleStateChange case e_BattleState.eBS_Loading: if (curState GameStateType.GS_Loading) CGLCtrl_GameLogic.Instance.AskLoadComplete(); break;客户端收到之后,SetStateTo(GameStateType.GS_Loading);进入Loading游戏状态。public void Enter() if (mNextState = GameStateType.GS_Continue) return; SetStateTo(GameStateType.GS_Continue); /加载?UI mUIRoot = GameMethod.LoadProgress(); LoadScene.Instance.GState = mNextState; LoadScene.Instance.OnLoadFinish += LoadFinish; /加载?场?景之?前需要癮进?行D清?除y操作痢? BlGame.Effect.EffectManager.Instance.DestroyAllEffect(); /清除GameObjectPool数据 GameObjectPool.Instance.Clear(); /加载场景 if (mNextState = BlGame.GameState.GameStateType.GS_Play) LoadScene.Instance.isCloseBySelf = false; string name = GetLoadMapName(); LoadScene.Instance.LoadAsignedSene(Scenes/+name); WindowManager.Instance.ChangeScenseToPlay(mFrontScenes); else /返回Pvp_Login选人界面需要清除预加载信息 ReadPreLoadConfig.Instance.Clear(); LoadScene.Instance.isCloseBySelf = true; LoadScene.Instance.LoadAsignedSene(Scenes/Pvp_Login); WindowManager.Instance.ChangeScenseToLogin(mFrontScenes); /AudioClip clip = Resources.Load(AudioDefine.PATH_UIBGSOUND) as AudioClip; /AudioManager.Instance.PlayBgAudio(clip); ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.PATH_UIBGSOUND, ResourceType.ASSET); AudioClip clip = clipUnit.Asset as AudioClip; AudioManager.Instance.PlayBgAudio(clip); EventCenter.AddListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail); EventCenter.AddListener(EGameEvent.eGameEvent_IntoRoom, OnEvent); 这里呢,mUIRoot = GameMethod.LoadProgress();加载loading界面:LoadScene.Instance.LoadAsignedSe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 考点解析-人教版八年级上册物理声现象《声音的特性声的利用》综合练习练习题(含答案解析)
- 2025历年招警考试真题及答案
- 难点解析苏科版八年级物理下册《物质的物理属性》同步训练练习题(含答案详解)
- 2025九江老师考试真题及答案
- 达标测试人教版八年级上册物理《声现象》章节测试试卷(含答案详解)
- 2025教师招聘成语考试真题及答案
- 后厨员工考试题及答案
- 难点解析-人教版八年级上册物理物态变化《汽化和液化》章节测评试卷(含答案详解)
- 2025护士技能考试真题及答案
- 自动控制原理期中考试及答案
- 保险基础知识培训
- 口腔药品急救知识培训课件
- 2025年教育系统学校中层后备干部选拔考试题(含答案)
- 养老院安全培训考试题及答案解析
- DB32-T 5192-2025 工业园区碳排放核算指南
- 湖南省九校联盟2026届高三上学期9月第一次联考日语试题(含答案)
- 时事政治讲座课件
- 四次侵华战争课件
- 2025年成人高考试题及答案
- 2025年上海市公安辅警、法检系统辅助文员招聘考试(职业能力倾向测验)历年参考题库含答案详解
- 2025年上海市大数据中心工作人员公开招聘考试参考题库及答案解析
评论
0/150
提交评论