Я продолжаю диалог с openGL и c ++, а пока хочу создать «сцены», которые будут менять друг друга. например, экран с кнопкой «перейти далее», я нажимаю кнопку и затем начинаю игру.
Каков наилучший подход с OpenGL в C ++ для этого? Главный вопрос в том, что делают с командами инициализации перенасыщения, такими как:
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(screenWidth, screenHeight);
glutInitWindowPosition(0,0);
glutCreateWindow("Puzzle quest!");
// Registration
glutDisplayFunc(Draw);
glutIdleFunc(Draw);
Нужно ли реализовывать этот метод в обоих классах или только в одном, а затем только «показать кнопку запуска / скрыть функциональность игры, скрыть кнопку запуска / показать функциональность игры + таймер запуска»?
Я не связываюсь с настройками экрана во время смены сцены / режима. Настройки экрана изменяются при изменении размера окна OpenGL, а не при каком-либо событии кнопки …
Вы должны написать свою визуализацию и логику пользовательского интерфейса в зависимости от некоторых переменных, например:
enum _game_screens_enum
{
_game_screen_main_menu=0,
_game_screen_game,
_game_screen_game_over,
_game_screen_help,
_game_screen_intro,
_game_screen_redefine_keys,
_game_screen_high_score,
_game_screen_exit,
};
int screen=_game_screen_main_menu;
Теперь в функции рисования, обновления и обработки пользовательского интерфейса просто добавьте соответствующие if, например:
void draw()
{
if (screen==_game_screen_main_menu)
{
// draw main menu ...
}
else if (screen==_game_screen_game)
{
// draw in game screen stuff...
}
else ...
}
И это все …
Вы ищете эффект затухания или какой-то переход, когда они смешиваются? Эффект затухания должен быть легким, если используется альфа-канал … включить смешивание … нарисовать черный квадрат перед всем, поскольку его альфа-значение увеличивается от 0 до 1 в течение любого периода времени, в который вы хотите, чтобы произошло затухание. Появление будет противоположным. Не уверен насчет эффекта смешения сцен … возможно, накопительный буфер или чтение пикселей, а затем нарисуйте пиксели, если вы можете изменить альфа-значения.
В противном случае glutDisplayFunc является правильным способом переключения между сценами / функциями рисования.
Попробуйте просто эффект затухания, это может оказать большую помощь.
Вы должны инициализировать перенасыщение только один раз.
Обычно обратные вызовы дисплея и ожидания будут делать разные вещи в зависимости от того, в каком состоянии вы находитесь.
На высоком уровне:
void idle()
{
if (showingMenu)
menu.idle();
else
currentScene.idle();
}
Вы можете сделать это путем переключения функций, но я думаю, что это затрудняет отладку.
(Вы, вероятно, не должны использовать одну и ту же функцию для рисования и холостого хода, хотя.)