最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

pvzclass是如何實現的?pvzclass源代碼初步分析(6)PVZ類直屬成員變量 & 方法

2021-07-14 12:25 作者:__W1thoutD0ubt  | 我要投稿

除去附屬的成員類,PVZ類也有直屬的成員變量和方法。?

本篇將對上述內容有關的代碼作簡單分析。

強烈建議在閱讀本篇前先閱讀第3篇和第4篇的內容

PVZ類直屬成員變量

PVZ類中的各種變量,大部分是用PVZ.H開頭的那些PROPERTY型的宏實現的。

直屬的成員變量也是如此。

不過定義使用的宏會更加五花八門,而不是局限于T_PROPERTY宏及其變種。

部分使用PROPERTY宏及其變種定義的變量
部分使用PROPERTY_BINDING宏定義的變量

第3篇中提到過,PROPERTY宏及其變種需要另外定義讀取函數和寫入函數。

對于PVZ類直屬的成員變量,這些函數的定義在PVZ.cpp中。

變量GameVersion的getmethod()

如要查詢某一成員變量的作用,對于不同的宏應采取不同的方式。

用T_PROPERTY宏及其變種定義的變量,默認從[PVZ_BASE+768],也就是作為基址。

而其他的宏就是八仙過海,各顯神通了。

繼續(xù)以上面提到的LevelId變量為例。根據代碼我們可以確定,這個變量與PVZ內部地址為"PVZ_BASE+0x7F8"的變量對應。

我們可以查找MemoryAddressList,從而確定這一變量的作用:

可以看出,LevelId變量對應的是PVZ中當前關卡的序號。

當然,這個變量的作用可以直接通過翻譯變量名來確認。

實際上,有的變量根本不對應PVZ本體的變量,而是一個類似方法的存在。

例如這個:

(判定當前場景是否為六行場地)

實際上,你可以考慮直接調用__get_SixRoute()……

PVZ類的方法

PVZ類的方法可以分為三類:常用功能、實例化單個對象、實例化某類全部對象。

“常用功能”部分包括五個函數:

GetZombieSeed()可以獲取當前關卡的可能出怪種類。

它的代碼是這樣的:

非常簡單。就是掃描一個數組,把符合條件的僵尸計入返回的列表中。

涉及到的BaseAddress+0x54D4的作用可以在MemoryAddressList中查到:

Earthquake(),正如其名,可以使PVZ本體的畫面出現震蕩(類似窩瓜落地、巨人錘地板等的視覺效果)。

聽上去就不好實現?其實不然:

套皮WriteMemory

涉及到的三個變量的作用同樣可以查到:

Assault()可以立即觸發(fā)一次襲擊(包括墓碑刷怪、珊瑚三人組、屋頂空降三人組)。

其原理和Earthquake()相同,也是運用WriteMemory。

Bell()的原理同上。

Win(),即“直接過關”,運用的是代碼注入:

生存模式各關卡對應的LevelId為1~15。在這些關卡下,如果在不正確的時機調用相應的函數,PVZ程序會崩潰。

因此Win()中有針對生存模式的特判。

接下來我們分析實例化單個對象的方法:

這些方法實例化的對象在PVZ本體中,除了Wave以外每關只能存在一個。

它們的代碼出奇地一致:

return new Class(ptr)

Wave類雖然在每關有多個,但實際上,GetWave()的代碼并不比其他方法的代碼簡單許多:

除了特判沒啥不同

實例化某類全部對象的方法可以直接將場上的一類對象全部囊括。以下的方法都可以實例化某類全部對象:

它們的定義也基本一樣:

確認最大數目,掃描對應內存,確認對象是否存在,若存在則加入對應列表。

因為所有的代碼都按照上述的方法實現,這里就不再全部貼上了。

下一篇將PVZ類剩下的內容一并分析完,給PVZ.h的分析畫上一個句號。

pvzclass是如何實現的?pvzclass源代碼初步分析(6)PVZ類直屬成員變量 & 方法的評論 (共 條)

分享到微博請遵守國家法律
新和县| 恩平市| 项城市| 桃园县| 黑水县| 尼玛县| 中阳县| 名山县| 循化| 安福县| 宾阳县| 静海县| 昌江| 商南县| 安图县| 石棉县| 五莲县| 凤山市| 安丘市| 马关县| 山丹县| 泽州县| 九台市| 襄樊市| 瑞金市| 即墨市| 绥滨县| 菏泽市| 时尚| 江津市| 莱芜市| 宜州市| 遵义市| 息烽县| 松阳县| 凤冈县| 大化| 奉化市| 大石桥市| 财经| 巧家县|