遊戲對象的實現 (上)

狹義的遊戲對象是指遊戲世界中所能看到及可交互的對象,如玩家、怪物、物品等,咱們這裏也主要討論這類對象在服務器上的組織及實現。

  在大部分的MMOG中,遊戲對象的類型都大同小異,主要有物品、生物、玩家等。好比在wow中,經過服務器發下 來的GUID咱們能夠了解到,遊戲中有9大類對象,包括物品(Item)、揹包(Container)、生物(Unit)、玩家(Player)、遊戲對 象(GameObject)、動態對象(DynamicObject)、屍體(Corpse)等。服務器

  在mangos的實現中,對象使用類繼承的方式,由Object基類定義遊戲對象的公有接口及屬性,包括 GUID的生成及管理、構造及更新UpdateData數據的虛接口、設置及獲取對象屬性集的方法等。而後分出了兩類派生對象,一是Item,另外一是 WorldObject。Item即物品對象,WorldObject顧名思義,爲世界對象,便可添加到遊戲世界場景中的對象,該對象類型定義了純虛接 口,也就是不可被實例化,主要是在Object對象的基礎上又添加了座標設置或獲取的相關接口。spa

  Item類型又派兵出了一類Bag對象,這是一種特殊的物品對象,其自己具備物品的全部屬性及方法,但又可做爲 新的容器類型,並具備本身特有的屬性和方法,因此實現上採用了派生。mangos在實現時對Bag的類型定義作了點小技巧,Item的類型爲2,Bag的 類型爲6,這樣在經過位的方式來表示類型時,Bag類型也就同時屬於Item類型了。雖然只是很小的一個技巧,但在不少地方卻帶來了極大的便利。對象

  從WorldObject派生出的類型就有好幾種了,Unit、GameObject、 DynamicObject和Corpse。Unit爲全部生物類型的基類,同WorldObject同樣,也不可被實例化。它定義了生物類型的公有屬 性,如種族、職業、性別、生命、魔法等,另外還提供了相關的一些操做接口。遊戲中實際的生物對象類型爲Creature,從Unit派生,另外還有一類派 生對象Player爲玩家對象。Player與Creature在實現上最大的區別是玩家的操做由客戶端發來的消息驅動,而Creature的控制是由自 己定義的AI對象來驅動,另外Player內部還包括了不少的邏輯系統實現。繼承

  另外還有兩類特殊的Creature,Pet和Totem,其對象類型仍然仍是生物類,只是實現上與會有些特殊 的東西須要處理,因此在mangos中將其做爲獨立的派生類,只是實現上的一點處理。另外在GameObject中也實現有派生對象,最終的繼承關係圖比 較簡單,就不麻煩地去畫圖了。接口

  從我所瞭解的早期遊戲實現來看,大部分的遊戲對象結構都是採用的相似這種方式。可能與早期對面向對象的理解有關,當面向對象的概念剛出來時,你們認爲繼承就是面向對象的所有,因此到處皆對象,到處皆繼承。遊戲

  類實現的是一種封裝,雖然從雲風那裏出來的棄C++而轉投C的聲音可能會影響一部分人,可是,使用什麼語言自己 就是我的喜愛及團隊總體狀況決定的。咱們所要的也是最終的實現結果,至於中間的步驟,徹底看我的。仍是用雲風的話說,這只是一種信仰問題,我依然採用我所 熟悉的C++,下面的描述也是如此。it

  隨着面向對象技術的深刻,以及泛型等概念的相繼提出,軟件程序結構方面的趨勢也有了很大改變。C++大師們常說 的話中有一句是這樣說的,滿是採用組合而不是繼承。遊戲對象的實現也有相似的轉變,趨向於以組合的方式來實現遊戲對象類型,也就是實現一個通用的 entity類型,而後以腳本定義的方式組合出不一樣的實際遊戲對象類型。容器

  描述的有些抽象,具體實現下一篇來仔細探討下。
基礎

相關文章
相關標籤/搜索