pvzclass是如何實(shí)現(xiàn)的?pvzclass源代碼初步分析(7)PVZ類的其他成員類
在第5篇中,我們已經(jīng)具體分析了Plant類和Zombie類的代碼。
本篇將對PVZ類剩余的成員類進(jìn)行分析。
強(qiáng)烈建議在閱讀本篇前先閱讀第3~5篇的內(nèi)容。
注:本文以2021.6.27更新的版本為準(zhǔn)。




成員類介紹
PVZ類的直屬成員類共有22個,每一個都與PVZ本體中的變量存在直接的對應(yīng)關(guān)系。
其中,Grave(墓碑)、Crater(毀滅菇生成的坑洞)、Brain(腦子)、Snail(花園的蝸牛)和Vase(罐子)都是Griditem的派生類。
CardSlot類具有自己的成員類SeedCard,以控制每個卡槽的屬性。
SaveData類具有自己的成員類GardenPlant,以控制花園植物的屬性。
在官方Readme文件中,PVZ類的直屬成員類分為三種:
Animation類。
部分類可以用pPVZ->GetAllXXX的方式獲得全部可用的對象。
以下類屬于唯一指定的類:
Icetrace
Wave
Mouse
MousePointer
Caption
Miscellaneous
SaveData
以下類屬于游戲內(nèi)的對象實(shí)體類:
Zombie
Projectile
Plant
Coin
Lawnmover
Griditem及其派生類
CardSlot
當(dāng)然,Animation類實(shí)際上也可以算作對象實(shí)體類。
SeedCard類和GardenPlant類在代碼上和Wave類更加相似,也可以算作“唯一指定的類”(即使它們顯然不是唯一指定的)。
代碼分析
PVZ類的成員類都由三部分構(gòu)成:基址和構(gòu)造函數(shù)、對象屬性、方法。
在構(gòu)造函數(shù)上,CardSlot類和所有唯一指定的類都以"address"或"Baseaddress"為參數(shù)。這些類的構(gòu)造函數(shù)都是“地址+偏移”型的:
(以上為CardSlot類的構(gòu)造函數(shù))
Animation類,以及除CardSlot類外游戲內(nèi)的對象實(shí)體類則以"indexoraddress"或"idoraddress"為參數(shù)。
這些類的構(gòu)造函數(shù)在“地址+偏移”型的基礎(chǔ)上添加了將編號轉(zhuǎn)換為基址的代碼:
(以上為Projectile類的構(gòu)造函數(shù))
各種類在對象屬性上都一樣,除了少數(shù)屬性使用PROPERTY_BINDING宏及其變種定義外,幾乎所有屬性都用T_PROPERTY宏及其變種定義。
方法上,所有方法都是在PVZ.h中聲明,在其他源代碼文件中定義。這些文件集中于Classes文件夾。
雖然PVZ類的成員類方法繁多,但在原理上可以大致分為以下多種:




值得一提的是,Animation類的UnLock()方法使用了狀態(tài)壓縮,其狀態(tài)的定義在PVZ.h開頭:

看上去很長的代碼,實(shí)際上并不復(fù)雜。找到了原理層面的東西后,就不難分析pvzclass的代碼了。

下一篇將分析Creaters,pvzclass生成對象的代碼。

參考資料與文獻(xiàn)
pvzclass的Readme文檔
Lazuplis-Mei(Github名)于2019年6月11日上傳
YouTheB(Github名)于2020年3月更新