首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构化Pong

结构化Pong
EN

Stack Overflow用户
提问于 2011-06-13 01:48:21
回答 3查看 931关注 0票数 1

我使用C++和OpenGL制作乒乓,使用Visual Express2010。这是我制作的第一个游戏之一,我想知道如何最好地构建它。难住我的主要部分是游戏菜单。我应该把不同的游戏模式放在不同的功能中,并在我的主功能中有一个开关吗?例如,在Main.cpp中,我会包含下面这行

代码语言:javascript
运行
复制
glutDisplayFunction(maincode)

在另一个文件中,我会像这样定义主代码(同样,伪代码):

代码语言:javascript
运行
复制
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++程序员为生,但我没有游戏编程的经验。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-13 01:51:17

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

最好使用枚举,即

代码语言:javascript
运行
复制
enum GameMode {

  GM_SinglePlayer, GM_Multiplayer, GM_Menu

};

和类型为GameMode的单个变量

代码语言:javascript
运行
复制
GameMode mode;
mode = GM_Menu;

拥有不同的、互斥的(这就是您在这里遗漏的一点!)在两个状态之间切换是编程中的一个重要概念,因此您肯定是在正确的轨道上。继续工作。

票数 4
EN

Stack Overflow用户

发布于 2011-06-13 02:33:52

组织图形用户界面应用程序的最好方法是使用MVC design pattern。要么是这样,要么就是小的修改presenter first

知道这一点,像你这样的问题的答案很容易回答(Alexander Gessler的答案很好)

票数 0
EN

Stack Overflow用户

发布于 2011-06-13 03:49:39

glutDisplayFunc()是一种快速显示内容的方法,但在编写简单的项目时,它很快就会变得比它更麻烦。

除非您使用多线程并保留游戏状态的常量副本以供glutDisplayFunc()读取,否则我建议您避免使用它-即使到了那时,也可能会使用它。

对于游戏循环,我认为最好是驱动OpenGL,而不是让它驱动你。

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
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等都是自己编的)。使用任何适合的函数/类型。

我很快就想起来了--甚至可能有一些but -但它可能会给你一个想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6323512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档