遊戲伺服器設計之屬性管理器

2021-08-14 11:48:28 字數 2454 閱讀 5972

遊戲中角色擁有的屬性值很多,運營多年的遊戲,往往會有很多個成長線,每個屬性都有可能被n個成長線模組增減數值。舉例當角色戴上**時候hp+100點,卸下**時hp-100點,這樣加減邏輯只有一處還比較好控制,如果某天有個特殊功能當被某技能攻擊時,角色**會被擊落,這樣就會出現減數值的操作不止一處。如果邏輯處理不當,比如擊落的時候沒有恰當的減數值,再次穿戴**就導致屬性值加了兩邊,也就是玩家經常說的刷屬性。這種bug對遊戲平衡性影響很大,反響很惡劣,bug又很難被測試發現。本文將介紹一種管理屬性的思路,最大限度的避免此類bug,如果出現bug,也能夠很好的排查。

刷屬性bug的核心原因是某功能的模組數值加了n次,所以各個模組加的屬性要被記錄,加過了必須不能重複加。設計這樣的資料結構。

//!各個屬性對應乙個總值

//!各個屬性對應各個模組的分值

template

class propcommonmgr

functorget fget;

functorset fset;

std::map

modulerecord;

};void reggettersetter(const

std::string& strname, functorget fget, functorset fset)

public:

std::map

propname2gettersetter;

};

關於資料結構的get和set,我們為每個屬性命名乙個名字,這樣處理資料的時候會非常方便(比如道具配增加屬性等等),角色屬性有很多種,這裡不能一一定義,所以屬性管理器只是對映屬性,並不建立屬性值。通過reggettersetter介面,註冊get和set的操作對映。為什麼不需要提供add和sub介面能,因為add和sub可以通過get和set組合實現。get和set的介面實現如下:

int64_t get(objtype obj, const

std::string& strname)

return

0; }

bool

set(objtype obj, const

std::string& strname, int64_t v)

return

false;

}

關於add和sub,前面提到要避免刷屬性,就必須避免重複加屬性。所以每個模組再加屬性前必須檢查一下是否該模組已經加了屬性,如果加過一定要先減後加。因為每次模組加屬性都記錄在屬性管理器中,那麼減掉的數值一定是正確的。這樣可以避免另外一種常見bug,如加了100,減的時候計算錯誤減了80,也會積少成多造成刷屬性。add和sub的**如下:

int64_t addbymodule(objtype obj, const

std::string& strname, const

std::string& modulename, int64_t v)

else

ret += v;

it->second.fset(obj, ret);

return ret;

}return

0; }

int64_t subbymodule(objtype obj, const

std::string& strname, const

std::string& modulename)

ret -= itmod->second;

it->second.modulerecord.erase(itmod);

it->second.fset(obj, ret);

return ret;

}return

0; }

int64_t getbymodule(objtype obj, const

std::string& strname, const

std::string& modulename)

}return

0; }

std::map

getallmodule(objtype obj, const

std::string& strname)

return ret;

}

如上**所示,addbymodule和subbymodule必須提供模組名,比如穿裝備的時候加血量:addbymodule(『hp』, 『weapon』, 100),而卸下**的時候只要subbymodule(『hp』, 『weapon』),因為屬性管理器知道減多少。

屬性提供乙個名字對映有很多好處,比如裝備配屬性,buff配屬性的,有名字相關聯會特別方便

提供乙個get和set介面的對映,這樣屬性管理器就和具體的物件的屬性欄位解耦了。即使是現有的功能模組也可以整合這個屬性管理器。

屬性的add和sub操作,都在屬性管理器中留下記錄,這樣即使出現問題,通過getbymodule getallmodule兩個介面亦可以輔助查詢問題。

遊戲伺服器設計之任務系統

任務系統是遊戲中最重要的系統之一,本文旨在設計乙個輕量清晰的任務系統。通用易擴充套件是本系統關注的重點。任務系統中當角色的條件滿足時,自動觸發每一型別的任務,每個任務有其所需的完成條件,當角色完成了指定的操作後,則會觸發任務自動完成,任務完成後一般玩家會領取對應的獎勵,結束任務,此任務的生命週期結束...

遊戲伺服器設計之NPC系統

npc系統是遊戲中非常重要的系統,設計的好壞很大程度上影響遊戲的體驗。npc在遊戲中有如下作用 引導玩家體驗遊戲內容,一般遊戲內有很多主線 支線任務,而任務的介紹 接取 領取獎勵等操作都是通過npc的操作,一般會有幾個核心npc,再不停的任務引導中,玩家會對核心npc印象深刻,強化了遊戲代入感。核心...

mysql 做遊戲伺服器配置 遊戲伺服器部署

bin bash 小菜鳥 掛機 版本 1.0 遊戲伺服器部署 基礎環境 mysql資料庫svn客戶端需部署才能執行此指令碼 if uid 0 then echo game server install else exit 1 firead p please create the storage ga...