构造乒乓球

时间:2011-06-12 17:48:21

标签: c++ opengl structure glut pong

我使用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 ++程序员,但我没有编程游戏的经验。

3 个答案:

答案 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等全部组成。使用任何适合的功能/类型。

快速离开我的头顶 - 可能甚至有一些错误 - 但它可以给你一个想法。