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 и т. Д. Все составлены. Используйте любую подходящую функцию / тип.
Быстро и не покладая рук - возможно, даже есть ошибки - но это может дать вам представление.