五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

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

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

分享到微博請遵守國家法律
车致| 乌兰县| 盈江县| 咸阳市| 昭苏县| 仁寿县| 大同县| 临桂县| 通榆县| 常宁市| 高安市| 荆州市| 漾濞| 徐汇区| 诏安县| 公主岭市| 榆树市| 宝丰县| 宜君县| 漳平市| 闵行区| 镶黄旗| 庆元县| 丰镇市| 营口市| 滕州市| 抚顺县| 当阳市| 海原县| 塘沽区| 鞍山市| 枣庄市| 双牌县| 绥宁县| 波密县| 沿河| 临潭县| 渭南市| 东台市| 静安区| 同德县|