pvzclass是如何實現(xiàn)的?pvzclass源代碼初步分析(1) 概覽
0. 寫在前面
為什么我要寫這篇分析?
天青開發(fā)的pvzclass(C++),給PVZ二次創(chuàng)作者提供了除匯編以外的另一選擇。
不過,本應(yīng)是降低開發(fā)門檻的工具,卻因自身的門檻,反倒是勸退了一些創(chuàng)作者。
而PVZ自制圈內(nèi)出名的作品中,使用pvzclass的并不很多。
雖然有Z2改版、皓月的PVZ Rogue,以及百花壇的作品等等佳作,但使用匯編的作品依然占據(jù)絕大多數(shù)。
這固然有匯編自身的原因,但是匯編語言相比C++而言有很多勸退性的缺點,比如難以維護、指令復(fù)雜、極難上手等。
而且有OI基礎(chǔ)的人顯然更熟悉C++。他們上手pvzclass的難度更低,實現(xiàn)較復(fù)雜的功能也更輕松。
除此之外,我自己接觸pvzclass時,走了很多彎路。
我撰寫本文,也是希望能把自己對pvzclass的理解和大家分享,讓大家能更快上手pvzclass。

接下來的部分中,筆者將默認讀者已有C++的編程基礎(chǔ)。
如果你要學(xué)習pvzclass,建議結(jié)合天青的教程觀看。
雖然是代碼分析,但也有可能會摻雜一些其他的東西,還請見諒。

1.pvzclass初見
從github上下載下來的應(yīng)該是一個名為"pvzclass-master.zip"的壓縮文件。
將其解包,可以得到一個文件夾(顯然),主要包含以下內(nèi)容:

其中".gitattributes"和".gitignore"不影響pvzclass的使用,我們忽略它們。
"LICENSE"是pvzclass的許可證,打開(用自帶的記事本打開即可)后可以看到pvzclass使用的是MIT許可證。(許可證相關(guān)內(nèi)容請自行百度)
"MemoryAddressList"看似無擴展名,實際上只是一份普通的文本文檔。
該文檔包含PVZ中大部分內(nèi)容的指針和內(nèi)部常量的儲存地址,可以說是對PVZ本體進行二次創(chuàng)作(尤其是使用匯編語言時)的必備文檔。
但本文主要是講pvzclass的,所以我們跳過它。
接下來的"pvzclass.sln"是Visual Studio(以下簡稱"VS")的解決方案文件,沒有安裝VS應(yīng)該是無法打開它來使用pvzclass的。
這也是盡量使用VS(而不是其他軟件)完成pvzclass創(chuàng)作的理由之一。
"Readme.md"我想不用多說,這里跳過。
打開剩下的"pvzclass"文件夾,會看到這些內(nèi)容:


看上去就很多很雜,對于習慣了單文件編程的人而言會有些目不暇接。我們分別來看。
這些文件中"pvzclass.sln""pvzclass.vcxporj""pvzclass.vcxproj.filters""pvzclass.vcxproj.user"是VS的文件,不要動它們(除非你不用VS)。
尤其是"pvzclass.sln",不要通過打開這個文件來開始應(yīng)用pvzclass!
"README.md"是較舊版本的,不用理它。
"MemoryAddressList"和上一級文件夾中的那一份相比含有額外內(nèi)容,也建議保留(但不一定留在這個文件夾里)。
剩下的頭文件和源代碼文件,以及"Classes""Enums"中的文件,就是pvzclass的核心組件了。
2.pvzclass組件間的關(guān)系
除去主要源代碼文件"pvzclass.cpp",剩下的文件間具有如下的從屬關(guān)系:

在pvzclass中,除去"pvzclass.cpp",剩余的文件均遵循“頭文件包含頭文件,源代碼文件解釋頭文件”的原則。
這是什么意思呢?
"頭文件包含頭文件"很好理解,即頭文件中包含其他的頭文件。(說了和沒說一樣)
以"pvzclass.h"為例,實際上這個文件只有6行:

除去第一行的編譯指令,剩下的就是其包括的頭文件。整個"pvzclass.h"只是一個索引。
而其他頭文件中,除去索引類文件,剩余的代碼主要包括三個部分:定義變量,定義函數(shù)與過程,以及實現(xiàn)函數(shù)與過程。
但實際上,變量的賦值、函數(shù)與過程的實現(xiàn)只有很小一部分,這類代碼大部分都在源代碼文件中。此即所謂“源代碼文件解釋頭文件”。

就先講這么多吧。
每個基于pvzclass的作品,必然要在程序的一開始調(diào)用來自"ProcessOpener.h"的方法。
因此,下篇將從"ProcessOpener.h"開始,分析pvzclass代碼的運行規(guī)則。