1

我正在使用 C++ 和 OpenGL 使用 Visual Express 2010 制作 Pong。这是我制作的第一款游戏之一,我想知道如何最好地构建它。难倒我的主要部分是游戏菜单。我应该把不同的游戏模式放在不同的功能中,并在我的主要功能中进行切换吗?例如,在 Main.cpp 中,我将包含该行

glutDisplayFunction(maincode)

在另一个文件中,我将 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

然后,我会在每个文件中检查单人游戏、多人游戏和菜单的值,以确定我处于哪种模式,然后相应地显示代码。

但是,我觉得随着游戏变得越来越复杂,这种方法会变得越来越复杂,所以我认为这不是正确的方法。

我应该如何构建游戏和菜单?

PS我是一个以C++为生的程序员,但我只是没有编程游戏的经验。

4

3 回答 3

4

bool当您需要的唯一信息是您当前处于哪种模式时,拥有 3 个不同的 s(总共 8 个不同的状态,其中 3 个是有效的)只是不必要的复杂性。

更好地使用枚举,即

enum GameMode {

  GM_SinglePlayer, GM_Multiplayer, GM_Menu

};

和一个类型的变量GameMode

GameMode mode;
mode = GM_Menu;

拥有不同的、互斥的(这就是你在这里错过的一点!)状态之间的切换是编程中的一个重要概念,所以你肯定走在正确的轨道上。继续工作。

于 2011-06-12T17:51:16.743 回答
0

组织 GUI 应用程序的最佳方式是使用MVC 设计模式。要么是那个,要么是先小修改演示者

知道这一点,您的问题的答案很容易回答(Alexander Gessler 的回答还不错)

于 2011-06-12T18:33:52.213 回答
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 等都是编出来的。使用任何适合的功能/类型。

快速而出乎我的意料 - 甚至可能有一些错误 - 但它可以给你一个想法。

于 2011-06-12T19:49:38.963 回答