我所做的声明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