Меню в игре во многом совпадает с меню в любом приложении - это набор элементов графического интерфейса с привязанным к ним поведением. Это применимо независимо от того, есть ли у вас определенное состояние меню или нет.
Есть несколько причин, по которым игры имеют разные состояния меню. Одна из них заключается в том, что игровые меню появились еще до того, как у нас были используемые библиотеки графических интерфейсов для игр, и большинство этих меню представляли собой просто наборы спрайтов и некоторые жестко запрограммированные процедуры для обработки щелчков мыши. Другая причина в том, что игры часто требуют, чтобы обработка ввода во время игры отличалась от той, которая требуется в меню, и поэтому зачастую проще иметь полностью отдельные подпрограммы для их обработки.
Но на самом деле, нет особой необходимости в отдельном игровом состоянии меню. Ваша игра обычно имеет графический интерфейс, с некоторыми видимыми элементами, некоторые невидимыми. Чтобы вызвать меню, вы просто создаете или отображаете элементы, которые вам нужны. Вам также может понадобиться приостановить игру на этом этапе. (Или нет, если это сетевая игра.) Если игра еще не ведется, неважно. Как правило, ваша система будет гораздо менее упрощенной версией этого:
// update
world.update()
gui.update()
// render
world.render3D()
world.render2D_overlays()
gui.render()
Последние 2 этапа можно даже объединить, если ваша система графического интерфейса адекватна.
Хотя я не всегда следую своему собственному совету, я думаю, что редко есть веская причина иметь отличный конечный автомат для игры. Существует небольшое количество объектов, которые существуют в небольшом количестве перестановок, и вам просто нужно обновить и отобразить их все.