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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

回合制-战斗机制-实现分析

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回合制-战斗机制-实现分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

記錄一下,想到哪里寫到哪里。

回合制游戲一般流程是

一定時間內等待玩家輸入,服務器計算該回合戰斗數據,客戶端收到數據后進行畫面表現。

以此循環到戰斗結束.

設計難點在于服務器返回怎樣的數據結構,既簡單又實現方便,數據量小,等具備常規工程化的特點。

?

夢幻舉例:

1.對于一些概率性的技能等,輸出肯定是一個確定的,比如觸發or未觸發。

2.對于傷害數值,輸出的是一個具體數字,包含暴擊,等相關信息。

方案1:

數據格式如果基于招式(技能,平A也可以看做是一個技能)的話,那么每個可攻擊單位的每次攻擊行為的數據可能像這樣

對于一次完整的戰斗,可達20個單位,每個單位的每次攻擊大約是 220字節,一個回合大約就是4kb的數據量,最大上限可能是9kb。對于一個10回合的戰斗,將會是40kb,還沒包括玩家信息召喚獸信息等數據

官網找的一個錄像幫戰5回合,

每個 回合攻擊序列都是這樣一個SkillAction數組,依次播放,這樣做存在的問題。是如果有技能是和該攻擊行為有交互,比如反震,那么就很棘手了。方案1 pass

?

方案2:

根據方案1的缺點,方案2做了如下改進,客戶端參與戰斗邏輯處理,對于數值,幾率等是服務器發送的,其余都可以是本地產生的結果。就算出外掛也只會影響他本人的體驗,關鍵數據都是在服務器。這樣的話,同一個技能,對應的數據客戶端和服務端可能就很不一樣。

異步戰斗,戰斗在開始前戰斗結果服務器已經產出,客戶端只需要模擬展現出畫面即可,和上面的方案2一樣,甚至傷害數值服務器也不用傳遞。只需要傳遞概率性 已經確定的東西,比如迷你西游,所有技能和寫天賦等都是概率,服務器只需要演算,輸出戰斗結果和概率事件即可,客戶端 演算的時候就按照 該局游戲數據的快照,比如裝備信息等,就可以模擬出整個游戲了。

之前做的一個小游戲三國志OL就是采用的這種方法來自動回合戰斗。這種方案的一個缺陷就是客戶端和服務端都要關心某個技能的實現,主要差別只是在概率上,

三國志OL的實現,完全是概率和堆數值,每個單位有一次出手機會,并且要么是普攻要么是釋放了技能,復雜度小很多,像迷你西游這種,每個單位攻擊可能存在反饋,比如你攻擊了某個單位,那個單位發起了反擊。這種情況就稍微復雜。在這種放下下,數據可能是這樣

這種從上往下從左往右執行的順序樹形結構,關于動畫等延時,完全由客戶端自助做主,因為他自己知道這個是什么技能,邏輯是什么,關于具體實現還可以參考行為樹的框架部分XYGame-AI設計4-行為樹-第2版本?? 達到攻擊多個目標群體攻擊等特點,每個動作的類型可能是這樣

這種的話無論是半自動還是全自動的回合戰斗,都可以用這種數據結構表示。當然了,對于客戶端也參與戰斗演算的話,就可以不需要行為樹那一套框架來,直接是上上圖哪種即可,因為客戶端本是知道哪些技能是并發那些技能是串行。那些技能有什么效果,都可以推演出來。

如果客戶端不參與技能的部分邏輯,那么可能就要包含一些具體的事件了,

例1:比如某次攻擊中A發起對B技能1,剛好走到B面前,砍了一刀,這時候受到了反震效果:。這個反震效果實在技能1邏輯執行中發生的。

例2:在技能1發起完畢,回到站位后,B對A發起了反擊。這個是在A行動完畢后執行的,這個沒什么問題。

例3:在B面前準備砍一刀時,隊友觸發了保護,站到B面前,A砍下了,隊友受到傷害。

這類技能執行期間加入了復雜的其他技能或者邏輯。如果客戶端不想參與技能的部分具體邏輯的感知,那么就可能通過配置表去配置這些技能的關鍵執行點或者執行邏輯的組合,即達到添加或者修改某技能的邏輯組合或者數值組合,只需要修改配置表即可,

處理手法1:對于這種都是 有很強的順序性,如觸發了反震肯定是因為你的攻擊,或者是反震除了概率性的前提條件,因為服務器給你的不是概率而是一個釋放or未釋放,存在一定的因果關系。所以在執行一個技能前就需要預讀下一個技能或者行為是什么,看看他們有沒有關聯,

相當于一次讀取2個技能,先判定他們之間是否有關聯性,比如反震,肯定是在砍了之后觸發。這種切入時機也可以配置表配出來,可以是3個截斷,技能釋放前,釋放中,釋放后。但是這樣局限于了1對1技能的交互,按照服務器的驗算邏輯序列化來看,順序應該是這樣

對于技能1觸發了2個技能,是平行關系,他們可以有一組加權判定到底誰先執行 誰后執行,當然也可以直接按照順序來播放,因為輸出序列服務器可以是按照序列來輸出的,客戶端只需要吧服務器輸出的關鍵信息播放即可。這樣方式看來還是繞道行為樹的那種框架去了。上圖就是一個順序節點。

一次1V1的戰斗服務器輸出的動作樹可能是這樣,這幾乎和行為樹沒什么兩樣,因果關系用子樹表示即可,看起來很好實現,可能和樹型結構天生適合處理復雜的組織關系吧。

圖中的Action節點的數據可能是這樣,當然也可以用命令cmd的方式來驅動

在做錄像的時候只需要吧這顆樹保存下來,以下幾種情況:

1.如果要能夠跳轉任意回合前跳后跳,因此每個回合之間不能有耦合性,每個回合初始都有一個當前戰局的快照,就可以保證每回合相互獨立。

2.如果要只能快進或者往后跳轉,那么1的快照就可以省略,改為初始回合的快照即可。當然這樣做肯定體驗不好,多用點數據實現1也是沒問題的

2.版本變更導致的技能或者邏輯的沖突,如果客戶端知會了具體邏輯的話,那么將會出現嚴重的錄像系統版本問題,情況更為復雜,

?

//------------------以上分析是針對夢幻西游的半自動回合(每回合可以下達戰斗指令,從而改變戰局等要素),又或者是迷你西游的全自動(法術什么的都是概率釋放,整個戰斗過程完全異步,客戶端開始前結果服務器就算好了),這種的buff debuff等都是基于回合的。稱作模式1吧。

//-----------------如果戰斗模式按照回合,但是技能 buff等是按照時間來的,中途沒有固定最大時間等待玩家輸出的操作指令,這種有點偏動作MMO類型的操作方式。只要技能釋放完成就可以下達下一個指令,而不同等待對方也攻擊完成后才統一等待指令。稱作模式2吧

區別在于傳統的是基于回合的,對于時間點就只有和服務器的交互也局限于每回合的等待玩家操作指令,其余時間都是可以由客戶端自由操控,比如加速播放 等,而模式2 的cd要么按照傳統的MMO做法,客戶端一套cd 服務器一套cd,他們關聯起來當做一個狀態來處理

基于模式1的那種類似于行為樹的結構要引入cd狀態,這個引入點可以是每回合的開始節點的快照信息包含了cd,客戶端根據時間自己做插值,當然錄像的話也是相同的手法,下回合又有新的cd狀態,用于cd數據的修正,在這里需要特別考慮一下網絡延時給cd修正帶來的影響。

如果不把cd狀態嵌在回合快照里面,而和一般的MMO做法一樣單獨采取一些消息手段 單獨處理,也是可以的,因為這種回合沒有中斷,始終是在播放,游戲一直在推進,如果你按下了技能就釋放沒按下那就平A,這種的設計對于錄像就不友好了,要么在另外做個這種消息的快照,要么錄像模式下直接不顯示cd,又或者客戶端自己模擬一個cd,因為技能的cd時間客戶端是可以通過配置表知道的(但是這種方式不適合配置表不能準確判定cd的情況下,比如某技能減少全局cd 50% 又或者是某藥品立刻冷卻所有cd,如果客戶端不想感知具體邏輯的話,這種方式就不適用)。等等方式

?

接下來就是吧上上圖的樹形關系解析為一個一個的動作了。之所以采用樹形結構,是因為他們的因果關系,普遍來說,這顆樹的層次一般不會很高,寬度和執行了的單位正相關。遍歷一次樹生成一個個動作序列,客戶端的

?

邏輯處理器只需要按照生成的動作序列,逐個執行即可,當然因為 一維的信息,因此要加入一些約定好的固定操作,比如順序節點,表示依次往下一個一個執行,遇到節點結束節點 才停止當前順序邏輯,比如并行節點,那么一次處理遇到結束節點之前的所有節點,比如某個藥瓶回血回藍,2個可以一起提示出來。又或者是反震技能和反傷技能一起發揮作用,總之和順序的遞進處理 不一樣

每遇到一個結束節點表示一個因果關系的結束。每個因果關系的序列的父節點,總是導火索。比如上圖的,B對A使用了反震技能,的導火索是A對B使用了技能1.,

每個節點的狀態可以是以下3中,Running 1 2 只是擴展出來的, 有沒有用還是要具體分析游戲邏輯的需求,這個和行為樹的行為節點的狀態很像。比如反震效果是在玩家攻擊后,還未回到站位前,在這里當做Running2 處理,觸發的,而保護技能是在玩家走到目標前面,還未砍下去觸發的,因此各個因果關系的果就有必要配置出在其父節點的什么狀態下切入。這樣的話又回到之前說的一個 配置的準確性問題,比如策劃有個這樣的需求,如果好友度達到了1W 那么就可以在開始節點執行保護。這樣的話那還和版本有關系。錄像能不能準確播放也會是個問題

上面幾個問題的根本原因是由于各個粒度嵌套很深的關系中,信息,要么全部服務器發送,要么一部分信息發送,那一部分的沒有發送的信息,會由客戶端通過一些手段(比如讀取配置)如果存在更改迭代,那么就會出問題。這樣來看的話,那就比較好解決了,由于錄像信息可以是客戶端生成的,在生成的時候也把這些未發送的信息快照一般記錄在內,這樣的話,錄像播放機就完完全全是個播放器了。如果客戶端知會了一些具體邏輯的代碼而不知簡單的配置的數據,那么這種做法就不行了,代碼片段你不能保存以供錄像用,雖然想這么多也可以,弄成腳本,但是問題由來了,前提是腳本涉及到的非腳本代碼能夠兼容。這簡直是個惡性循環。

?

TODO

?

轉載于:https://my.oschina.net/kkkkkkkkkkkkk/blog/1501389

總結

以上是生活随笔為你收集整理的回合制-战斗机制-实现分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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