Я не очень опытный, но для чего он стоит, метод, который я использую, заключается в следующем.Он не распознает явные «состояния» или «сцены» как таковые, а скорее полагается на добавление (и удаление) отдельных предметов в мой игровой мир.Каждый такой элемент может иметь свои собственные ключевые обработчики и знает, как и когда создавать другие такие элементы.
Конкретный пример:
GameItem является подклассом для всех элементов, которые можно поместить вМир.Это простая коллекция атрибутов, без поведения.Он подразделяется на элементы в игровом мире, такие как Буш, Плеер и т. Д., А также на элементы HUD, такие как ScoreDisplay и MainMenu.
Мир - это просто коллекция GameItems.
Мое «обновление»Функция выполняет итерацию по всем элементам в мире, вызывая их метод обновления, если они есть.
Моя функция 'draw' аналогичным образом выполняет итерацию по всем элементам в мире, рисуя каждый из них.(многие из них могут быть нарисованы массово, просто вызывая что-то вроде pyglet's Batch.draw)
Прямо при запуске приложения одним из первых элементов, добавляемых в мир, является объект MainMenu.У него есть метод on_key_down.
World.add просматривает добавляемый элемент.Если у элемента есть метод on_key_down, он добавляет этот обработчик в стек обработчиков ключа pyglet.(Точно так же это отменяет это в World.remove) (На самом деле, при отражении, я предполагаю, что world.add вызывает событие при добавлении элемента. Если модуль обработчика клавиатуры приложения заинтересован, то при получении одного из этих событий он затем выполняетдобавление ключа элемента, но это немного случайно в вопросе)
Метод MainMenu.on_key_handler смотрит на нажатую клавишу, и если это клавиша для запуска игры, то он делает сериюCalls:
# Do everything needed to start the game
# For dramatic pacing, any of these might be scheduled to be
# called in a second or so, using pyglet.clock.schedule_once
world.add(player)
camera.to_follow(player)
world.add(scoredisplay)
# Finally, remove the main menu from the world
# This will stop showing it on screen
# and it will remove its keyboard event handler
world.remove_item(self)
Это простой пример, но, надеюсь, вы увидите, как, вместо запуска игры, главное меню может вместо этого отображать вторичные меню, добавляя их в мир или что-то подобное.
Попав в игру, вы можете изменить «сцены», просто вызвав «world.remove» для всех предметов, которые вы больше не хотите видеть, и вызвав «world.add» для всех предметов в новой сцене..
Примером игры, которая использует эту технику, является предыдущая запись в Pyweek SinisterDucks: http://code.google.com/p/brokenspell/ (хотя, если честно,он не имеет четких «сцен» во время игры.Он использует эту технику для управления меню, игрой за экраном и т. Д.)