Sep 15, 2008

Amazing Macro

拜辛樂克颱風之賜,我終於在停擺兩個月之後打開編輯器,現在決定暫時押下小引擎,開始寫寫shader,打算只用DXUT的框架來玩玩。

沒想到這個月的第二篇文章就來記無趣的程式設計。既然是個無趣的主題,我也不打算寫清楚,就讓程式碼來說明一切吧!這次我想做的是「對從同一個原型衍生出的專案提供清楚設定的方式」,決定用巨集解決它!很難懂,沒關係,不是寫給你看的。

class SDUTConfig
{
public:
static bool Checked(int iOption);
static void Check(int iOption, bool fCheck);
};

#define BEGIN_SDUT_CONFIG() struct SDUTConfigSingleton {SDUTConfigSingleton(){
#define SDUT_ENABLE(option, enable) SDUTConfig::Check(option, enable);
#define END_SDUT_CONFIG() }~SDUTConfigSingleton(){}} gConfigSingleleton;

這三個巨集產生一個struct,一個很容易就會編譯失敗的結構與全域變數(我希望它夠容易編譯失敗,以保證每個專案只會產生一份設定),取個名字叫singleton,為的是編譯失敗時編譯器會告訴我:「你只需要一份!」(不過這未經測試啊,我就是這麼懶)。最後可以在專案的某個地方這麼寫:

BEGIN_SDUT_CONFIG()
SDUT_ENABLE(EnableMoneyRain, true)
END_SDUT_CONFIG()

好吧,我承認是學MFC的(那個EnableMoneyRain應該訂成enum,這應該可以略過不說吧?)所以之後我就有個簡單的方法,可以控制每個專案的設定了。

p.s. 早就想練shader了,沒練是因為一直以為自己很快就會把shader整進小引擎。
p.s.s. 這篇我越看越不順眼,但是刪掉的話九月就只剩一篇了!

No comments: