我所做的聲明global.h爲我所有的全局。並主要初始化它們。對於我的「基本/常規」變量(即相機,位置,迭代號,...),他們都是單獨聲明的。在主:
include "global.h"
Vector position_g = ...
Vector angles_g = ...
int time_g = 0;
int main() {
...
}
但是對於那些只在一個遊戲模式/電平是「部分具體」,即變量,我做了一個工會和枚舉。
enum mainGame{skipLevel, ...};
enum mainMenu {viewingSettings, ...};
typedef union generic_union {
int i;
char c;
bool b;
char s[100]; // or char * s;
float f;
} generic;
並聲明瞭一個globalData變量。
extern generic * globalData; // in global.h
generic * globalData = NULL; // in main
現在哪些可用於:
int main() {
...
globalData = malloc (sizeof (generic)*numGlobals);
globalData[skipLevel].b = false;
...
}
現在,當你的按鍵處理函數,你可以指定一個鍵觸發全球國際[skipLevel。而在其他文件中,你所要做的就是包含global.h。
include "global.h"
void onKeyPress (...) {
If (inMainGame) {
If (key == SPACE) {
globalData [skipLevel] = true;
}
}
最後使用:
include "global.h"
void levelManager() {
...
if (globalData[skipLevel]) level++;
...
}
優點 只需要隨身揹着變量和一個包括。
您可以釋放您不再需要或正在使用的變量。 (很用於減少「污染」)。如果一個遊戲模式只需要1個變量,那麼就只需要存儲48個數據就可以了!
可以輕鬆處理任何變量類型,方法是將其添加到聯合中。
完全可移植
缺點 一定要記住取消引用通用工會變量類型(並不難)
而且WATCHOUT對枚舉使用(你可以使用樣式枚舉像mainMenu_e到解決這個問題)
增加了複雜性,但隨着可變數量的增長,這樣的系統非常值得。
就我個人而言,儘管沒有額外的移動部件,但我覺得這很整齊。 如果這不清楚,讓我知道,我會嘗試修復它:)
謝謝,看起來像它會工作。 – 2012-01-29 09:52:39