日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《炉石传说》架构设计赏析(3):Gameplay初探

發(fā)布時間:2024/8/26 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《炉石传说》架构设计赏析(3):Gameplay初探 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

經過前面的分析,我們已經找到了兩個關鍵的類Gameplay和GameState(當然還有我最感興趣的Spell和SpellController,這兩個還要在后面分析)。

首先我們看一下Gameplay這個類的Awake方法,它完成的主要工作是:

1.調用“GameState.Initialize()”創(chuàng)建一個新的GameState實例;

2.注冊CreateGame事件:在Gameplay.OnCreateGame()中響應,主要是
?

  • 初始化卡背;(本地玩家和遠程玩家的卡背ID都通過Player類來讀取);
  • 啟動一個Coroutine:NotifyPlayersOfBoardLoad,它做的主要工作是
  • 等待BoardStandardGame對象加載完成;
  • 然后調用所有Player的OnBoardLoaded(),它的主要工作是初始化法力水晶相關的管理邏輯;


3.使用AssetLoader加載AttackSpellController、SecretSpellController、TurnStartManager等;

這些類看上去都很重要,我們后續(xù)分析游戲邏輯時肯定用得到。

接下來我們要看一下Gameplay.Start()方法,它主要是注冊了一些自己關心的網絡消息,然后調用
?

  • Network.StartCountdown()——發(fā)送網絡消息“BeginPlaying”;
  • Network.GetGameState()——發(fā)送網絡消息“GetGameState”;


我們在看一下Gameplay.Update(),里面似乎正常情況只是調用GameState.Update()。

OK,以上就是從MonoBehavior繼承來的三個被自動調用的函數(shù)。對于游戲邏輯來說,還是沒有什么頭緒。

再往下分析,遇到的一個最大的困難是很多操作應該是通過網絡交互完成的,例如【認輸】操作,分析它是從GameMenu.ConcedeButtonPressed()開始的,一直調用到ConnectAPI.Concede()向服務器發(fā)了一個GiveUp消息,但是無法確定它對應的服務器返回消息是什么。

接下來我們先分析一下游戲的回合的流轉,還是先看一下相關的類圖:
?


回合結束是由玩家點擊右側的【End Trun】操作來觸發(fā)的,其對應的代碼為:InputManager.DoEndTurnButton(),這個函數(shù)的邏輯有些費解,目前只能是猜測如下:
?

  • 首先判斷當前是否允許訪問GameState的OptionsPacket,以及EndTurnButton是否可以操作;
  • 然后根據(jù)GameState.GetResponseMode()來分兩種情況處理:

  • GameState.ResponseMode.OPTION——賣二手游戲初步猜測為游戲回合中的正常操作:
  • 從GameState中取出所有的Network.Options,然后遍歷,找到“OptionType.END_TURN”或者OptionType.PASS的對象,然后調用GameState.SetSelectedOption(i);GameState.SendOption();
  • GameState.ResponseMode.CHOICE——初步猜測為游戲回合開始時,選擇初始手牌的相關操作;


服務器端的行為就比較難以猜測了,只能等到客戶端行為分析比較完整時再說了。

服務器端相關的返回大致是這樣的,在Gameplay的Start中有這樣一句:
?

  • network.RegisterNetHandler(Network.PacketID.ALL_OPTIONS,new Network.NetHandler(this.OnAllOptions));
  • 復制代碼


    想象中客戶端使用Gameplay.OnAllOptions()處理網絡層接收到的所有玩家操作,此函數(shù)主要是將Network.GetOptions()取出的數(shù)據(jù)發(fā)送到GameState.OnAllOptions()去處理,后者主要會觸發(fā)事件GameState.FireOptionsReceivedEvent()。

    我們通過對應的GameState.RegisterOptionsReceivedListener()成員函數(shù),可以分析一下哪些對象會響應此事件。找到EndTurnButton.OnOptionsReceived()。

    這階段的分析難度越來越大了,這次分析算是有小小的收獲,但是整個回合流轉的流程還沒有清晰。總結如下:
    ?

    • 玩家的操作是在InputManager中處理的,重點的成員函數(shù)包括DoNetworkResponse()、DoEndTurnButton();
    • 玩家的操作和網絡發(fā)送來的操作都保存在GameState.m_options中;
    • 其中有另外一個Entity類體系也需要進一步分析。

    總結

    以上是生活随笔為你收集整理的《炉石传说》架构设计赏析(3):Gameplay初探的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。