Структурирование понг - PullRequest
1 голос
/ 12 июня 2011

Я делаю Pong с использованием C ++ и OpenGL с использованием Visual Express 2010. Это одна из первых моих игр, и мне интересно, как ее лучше структурировать.Основная часть, которая озадачивает меня - это игровое меню.Должен ли я поставить разные режимы игры в разные функции и включить переключатель в основной функции?Например, в Main.cpp я бы включил строку

glutDisplayFunction(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

IЗатем в каждом файле отметьте значения для одиночной игры, многопользовательской игры и меню, чтобы определить, в каком режиме я нахожусь, а затем отобразите соответствующий код.

Однако мне кажется, что этот метод получит многовсе сложнее, поскольку игра становится все сложнее, поэтому я не думаю, что это правильный способ сделать это.

Как мне структурировать игру и меню?

PS Я C ++Программист для жизни, но у меня просто нет опыта программирования игр.

Ответы [ 3 ]

4 голосов
/ 12 июня 2011

Это просто ненужная сложность иметь 3 различных bool с (всего до 8 различных состояний, 3 из которых будут действительными), когда единственная информация, которая вам нужна, это какой режим вы в данный момент находитесь.

Лучшеиспользуйте перечисление, т. е.

enum GameMode {

  GM_SinglePlayer, GM_Multiplayer, GM_Menu

};

и одну переменную типа GameMode:

GameMode mode;
mode = GM_Menu;

Имея различные, взаимоисключающие (в этом и заключаетсяздесь пропущено!) переключение состояний - важная концепция в программировании, поэтому вы определенно на правильном пути.Продолжайте работать.

0 голосов
/ 12 июня 2011

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() возвращает значение, определяющее, какой пункт меню был выбран.

1025 *
*

Игровой цикл, который работает с постоянной скоростью и не расходует ресурсы процессора.

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 - игровой класс (если вы хотите стать ОО).

  • get_time (), wait_till (), time_type и т. Д. Все составлены. Используйте любую подходящую функцию / тип.

Быстро и не покладая рук - возможно, даже есть ошибки - но это может дать вам представление.

0 голосов
/ 12 июня 2011

Лучший способ организовать приложение с графическим интерфейсом - использовать шаблон проектирования MVC .Либо так, либо это небольшая модификация сначала докладчик .

Зная, что ответы на такие вопросы, как ваш, просты (ответ Александра Гесслера вполне приемлем)

...