我使用C++和OpenGL制作乒乓,使用Visual Express2010。这是我制作的第一个游戏之一,我想知道如何最好地构建它。难住我的主要部分是游戏菜单。我应该把不同的游戏模式放在不同的功能中,并在我的主功能中有一个开关吗?例如,在Main.cpp中,我会包含下面这行
glutDisplayFunction(maincode)在另一个文件中,我会像这样定义主代码(同样,伪代码):
maincode():
switch m:
case 1:
singleplayer = true
multiplayer = false
menu = false
case 2:
singleplayer = false
multiplayer = true
menu = false
case 3:
singleplayer = false
multiplayer = false
menu = true然后,我会在每个文件中检查singleplayer、multiplayer和menu的值,以确定我所处的模式,然后相应地显示代码。
然而,我有种感觉,随着游戏变得越来越复杂,这种方法会变得更加复杂,所以我认为这不是正确的方法。
我应该如何组织游戏和菜单?
另外,我以C++程序员为生,但我没有游戏编程的经验。
发布于 2011-06-13 01:51:17
当您需要的唯一信息是您当前所处的模式时,拥有3个不同的bool(总共8个不同的状态,其中3个将是有效的)是不必要的复杂性。
最好使用枚举,即
enum GameMode {
GM_SinglePlayer, GM_Multiplayer, GM_Menu
};和类型为GameMode的单个变量
GameMode mode;
mode = GM_Menu;拥有不同的、互斥的(这就是您在这里遗漏的一点!)在两个状态之间切换是编程中的一个重要概念,因此您肯定是在正确的轨道上。继续工作。
发布于 2011-06-13 02:33:52
组织图形用户界面应用程序的最好方法是使用MVC design pattern。要么是这样,要么就是小的修改presenter first。
知道这一点,像你这样的问题的答案很容易回答(Alexander Gessler的答案很好)
发布于 2011-06-13 03:49:39
glutDisplayFunc()是一种快速显示内容的方法,但在编写简单的项目时,它很快就会变得比它更麻烦。
除非您使用多线程并保留游戏状态的常量副本以供glutDisplayFunc()读取,否则我建议您避免使用它-即使到了那时,也可能会使用它。
对于游戏循环,我认为最好是驱动OpenGL,而不是让它驱动你。
enum EMode { ...etc };
EMode menu();
void single();
void multi();
int main()
{
init(...);
bool loop = true;
while(loop)
{
switch(menu())
{
case EMode.single:
game_loop(1);
break;
case EMode.multi:
game_loop(2);
break;
case quit:
loop = false;
...etc
}
}
finish(...);
return 0;
}简单的菜单循环。(请原谅我的代码风格,它与平时不同)。
这不是一个很好的布局,但它可以用于一个简单的游戏。
init()初始化openGL。menu(),single()和multi()都有自己的循环,用于呈现和交换缓冲区manually.menu()返回一个值,指定所选的菜单项。以恒定速度运行的游戏循环,不会浪费CPU。
void game_loop(int players)
{
CGame game = new Game(players);
bool loop = true;
time_type next_frame = get_time() - 1;
while(loop)
{
time_type time = get_time();
if(time > next_frame)
{
do_input(game);
while(time > next_frame)
{
game.tick();
next_frame += frame_period;
}
do_render(game); // draw stuff here, and swap buffers.
}
else
{
// Don't waste CPU (optional).
wait_till(next_frame);
}
}
}再说一次,不是很棒,但功能足够了。(我使用类似这样的东西)。
我很快就想起来了--甚至可能有一些but -但它可能会给你一个想法。
https://stackoverflow.com/questions/6323512
复制相似问题