我使用Visual Express 2010使用C ++和OpenGL制作Pong。这是我制作的第一批游戏之一,我想知道如何最好地构建它。困扰我的主要部分是游戏菜单。我应该将不同的游戏模式放在不同的功能中,并在我的主要功能中切换?例如,在Main.cpp中,我将包含行
glutDisplayFunction(maincode)
在另一个文件中,我将maincode定义为类似的东西(再次,psuedocode):
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
然后,我会在每个文件中检查单人,多人和菜单的值,以确定我所处的模式,然后相应地显示代码。
然而,我觉得随着游戏变得越来越复杂,这种方法会变得更加复杂,所以我认为这不是正确的方法。
我应该如何构建游戏和菜单?
P.S。我是一名C ++程序员,但我没有编程游戏的经验。
答案 0 :(得分:4)
当您需要的唯一信息是您当前所处的模式时,拥有3个不同的bool
s(总共8个不同的状态,其中3个有效)只是不必要的复杂性。
更好地使用枚举,即
enum GameMode {
GM_SinglePlayer, GM_Multiplayer, GM_Menu
};
和GameMode
类型的单个变量:
GameMode mode;
mode = GM_Menu;
拥有不同的互斥(这就是你在这里错过的点!)说明切换是编程中的一个重要概念,所以你肯定是在正确的轨道上。继续工作。
答案 1 :(得分:0)
组织GUI应用程序的最佳方法是使用MVC design pattern。要么是,要么是小修改presenter first。
知道这些问题的答案,你很容易回答(亚历山大盖斯勒的回答很好)
答案 2 :(得分:0)
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()
都有自己的循环,可以手动渲染和交换缓冲区。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);
}
}
}
再次,不是很精彩,但功能足够。 (我使用这样的东西)。
CGame是游戏类(如果你想成为OO)。
get_time(),wait_till(),time_type等全部组成。使用任何适合的功能/类型。
快速离开我的头顶 - 可能甚至有一些错误 - 但它可以给你一个想法。