【问题标题】:How to do Game logics in OpenGL (GLUT) and C++? [closed]如何在 OpenGL (GLUT) 和 C++ 中执行游戏逻辑? [关闭]
【发布时间】:2012-01-10 00:54:56
【问题描述】:

我正在使用 OpenGL(GLUT) 和 C++ 编写游戏 Battleship。

我知道如何处理图形(例如显示字段和预定义的船只), 但是我应该把我的游戏代码放在哪里:

  • 如果左键按下,则选择左侧一个字段并显示它
  • 如果放置了船,则显示该船

诸如放置船(在字段之间切换)之类的事情我不能在 display() 函数中进行,但是如果放置了船,则必须由 display() 函数绘制,对吗?

我不知道把游戏逻辑放在哪里。

【问题讨论】:

    标签: opengl logic glut


    【解决方案1】:

    您正在寻找的是基本的经典game loop。实际上,您的游戏在一个巨大的循环中运行。在这个循环中,您处理用户输入、对用户输入做出反应、运行 AI 并更新视频/音频作为响应。当然,这是一个非常简化的版本,但对战舰来说已经足够了。

    从概念上讲,或多或少:

    while(Game.IsRunning)
    {
        Input = GetInput();
        Game.Update(Input);
        Display(Game);
    }
    

    如果您实际上是在做实时而不是事件驱动,那么您需要在更新时考虑自上次更新以来经过的时间以及玩家输入。我会保持简短,但仅限于您的要求。

    【讨论】:

      【解决方案2】:

      GLUT 提供拦截鼠标键盘事件的函数,例如

      void keyboardDown(unsigned char key, int x, int y);
      void mouseClick(int button, int state, int x, int y);  
      void mouseMotion(int x, int y);
      

      您可以重新实现这些功能以获得程序的自定义行为。

      例如,如果您想在用户按下“s”后绘制一艘船,那么在您的keyboardDown 函数中,您可以将全局标志设置为 1。然后,在显示函数中,您可以检查该标志.如果是1,那么您将绘制您的船。

      当然,如何放置/移动你的船取决于你 :)

      欲了解更多信息,请查看documentation

      【讨论】:

        【解决方案3】:

        您可能想要使用键盘功能并将按下的键保存在堆栈上,并在显示屏上比较玩家按下的键,这样您就可以检测到多个键,如下所示:

        // for pressed keys
        void keybd(unsigned char key,int x, int y){
        //int pe;
         switch(key){
          case 'w':up=true;break;
          case 's':down=true;break;
          case 'd':right=true;break;
          case 'a':left=true;break;
          case ' ':trig=true;break;
         }
        }
        // for released keys
        void ms_r(unsigned char key,int x, int y){
        //int pe;
         switch(key){
          case 'w':up=false;break;
          case 's':down=false;break;
          case 'd':right=false;break;
          case 'a':left=false;break;
         }
        }
        

        然后只比较哪些键为真并据此采取行动 当你调用 glut 主循环和函数时 使用:

        glutIgnoreKeyRepeat(1);
        glutKeyboardUpFunc(ms_r);
        glutKeyboardFunc(keybd);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多