I've been designing a game engine which I'm using to prototype various aspects of game development theory. So far it looks like this:

AppGameLibArchitectureThe idea is that each game will develop its own LevelManager, which will manage what a level is, including the creation of game objects and the subscription of the game to types of game events. The Level Manager will also produce its own polling function for detecting user input, this allows the Level manager to respond to input and perform game commands in response to those actions. The Game commands class is also per game and independent of the game engine. This would be where the main game commands/actions are programmed and represent a unified interface of all possible game commands. You should call this when the input is detected that corresponds to a game command. The level state and managed by the Level Manager.

The GameStructure is managed by the engine and will poll your input function and send events to objects that have subscribed to them. It will also send updates and draw events as part of the game loop. The Event manager is not controlled by the game but by the game engine and it will see that events get to your game objects. Your game objects subscribe and raise events directly with the event manager, but the game loop in the GameStructure is what directly asks the EventManager to call objects when events that they subscribe to have been raised by other objects (this put the events into the event manager).

Code is here: https://github.com/stumathews/cppgamelib