我所理解的網絡遊戲<?>:戰鬥邏輯設計

客戶端發送消息,統一在服務器端觸發戰鬥
服務器端驅動戰鬥過程
客戶端端接收用戶輸入向服務器發送消息
客戶端接收服務器消息顯示客戶端表現
 
1. 服務器--客戶端交互(戰鬥流程)
整戰鬥流程分爲4個狀態:戰鬥準備,戰鬥開始,戰鬥進行,戰鬥結束。其中戰鬥進行狀態時服務器客戶端能夠進行兩種交互,一種是服務器端定時器觸發戰鬥循環,另外一種是客戶端玩家發送戰鬥操做。具體以下:
a. 戰鬥準備
 
b. 戰鬥開始
· 初始化戰鬥相關信息,即從基礎信息模塊中得到角色、陣型、屬性,從戰鬥中得到戰場
· 啓動戰鬥實例的定時器,一個戰鬥實例用一個定時器。
· 在初始化戰鬥,特別是定時器的數據步驟中,須要根據屬性創建戰鬥對象的出招隊列。戰鬥對象能夠在戰鬥實例定時器下排成隊列一個接一個地調用。看策劃需求,相較而言ARPG的野怪能夠實現爲每一個野怪在該心跳下的一個定時器而非隊列。
 
c. 戰鬥循環
· buff發生改變的狀況包括:
1. buff定時失效 ,根據buff到達失效時間發送消息
2. buff定時扣血,根據扣血間隔發送buff改變消息
· 客戶端接收到buff改變的消息後要在相應操做:
buff扣血 ,客戶端播放扣血與buff的動畫特效
buff失效,客戶端中止播放buff的動畫特效
· 得到出招隊列首位角色的仇恨對象,若是該角色沒有仇恨對象,就直線向前移動,並結束該次心跳
仇恨角色的選取:
1. 玩家指定(我本身設計)
2. 系統指派,系統以必定半徑搜索角色周圍
· 經過與仇恨對象的距離判斷是否攻擊
與仇恨對象距離過遠,則朝向仇恨對象移動,並結束該次心跳
與仇恨對象距離能夠發動攻擊,檢查攻擊間隔
攻擊間隔已到則朝對象發動攻擊
攻擊間隔未到則結束該次心跳
· 若是發動攻擊,計算扣血
若是仇恨對象被攻擊死亡,清空進攻角色的仇恨對象
 
d. 戰鬥操做
我本身設計了玩家在場景中拖拽部隊選擇其攻擊對象的功能。
戰鬥操做只是更改戰鬥對象的一些數據,這些數據不會即時影響戰鬥循環,故不須要與戰鬥循環的心跳作同步。
 
e. 戰鬥結束
 
2. 服務器端戰鬥系統結構
CWarMgr是服務器的一個單例組件,負責管理服務器全部的戰鬥,包括建立戰鬥、向戰鬥實例派發消息、維持戰鬥心跳、結束戰鬥。
 
IWar是戰鬥實例的接口,派生出CWarPve,CWarPvpOnline,CWarPvpOffline三種實現類去處理三種不一樣的戰鬥。
IWar的建立應用了抽象工廠模式,由IWarCreator接口派生的實現類建立。
IWar包含了戰鬥雙方的數據,因爲服務器戰鬥循環以及客戶端發起戰鬥操做(在更改戰鬥雙方的數據時須要考慮多線程數據的同步,固客戶端更改數據須要加鎖?)
 
3. 客戶端戰鬥系統結構
相較服務器而言,客戶端增長了一個CWarScene戰鬥場景類負責管理戰鬥場景,它將包含一些IWarEffect戰鬥特效類(戰鬥特效的更新與播放)。IWarEffect主要派生出四種具體特效實現類,包括操做特效(僅變化模型着色以提示玩家)、粒子特效(特效只包含粒子)、動畫特效(特效包含粒子和動畫)、跳字特效(用於扣血等屬性數值的增減)。這些特效都在OnUpdate中查詢對於的SBuffInfo結構體,以肯定特效是否和如何播放。
 
4. 如何應對策劃修改
多數狀況下都是策劃攻,程序受,一塊兒來探討一下逆天的策劃會有什麼逆天的設計,如何留好接口進行擴展去應對這些設計。
a. 世界boss,多個玩家挑戰同一個超級boss 
b. 大亂鬥,玩家中途參戰 
c. 幫派戰,前軍中軍後軍3vs3 
d. 自動戰鬥,中途加入操做
相關文章
相關標籤/搜索