国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

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

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類直屬成員變量 & 方法的評論 (共 條)

分享到微博請遵守國家法律
青浦区| 友谊县| 凯里市| 怀仁县| 晴隆县| 九寨沟县| 阿坝县| 眉山市| 奉贤区| 美姑县| 鄂尔多斯市| 十堰市| 无棣县| 望奎县| 博野县| 通渭县| 珠海市| 霍邱县| 绥中县| 台东县| 揭阳市| 松原市| 麻栗坡县| 麻城市| 方正县| 明星| 梁平县| 邳州市| 临沂市| 天峻县| 婺源县| 德令哈市| 涿州市| 开远市| 井冈山市| 云林县| 南陵县| 南部县| 德令哈市| 成都市| 出国|