protected GameEngine() {
		// See my notes on REQUIRED_JRE about this
		if (Float.parseFloat(System.getProperty("java.version").substring(0, 3)) < REQUIRED_JRE) {
			logger.error(Helpers.concat("Invalid Java Version! ", REQUIRED_JRE, " or greater only"));
			Runtime.getRuntime().exit(0xDEADBEEF);
		}

		// Set up our 'singleton'
		instance = this;

		new GameSettings(this);
		// Create an instance of our GameSettings
		gameSettings = GameSettings.getInstance(this);

		gameScreenManager = new GameScreenManager();

		// Set the renderUpdateDelagotor to be the gameScreenManager
		// I'm not sure if i should create a method for this so it can be
		// overridden, used, or whatever.
		renderUpdateDelegator = gameScreenManager;

		// set up listeners for the eventHandler
		// addKeyListener(eventHandler);
		// addMouseListener(eventHandler);
		// addMouseMotionListener(eventHandler);
		// logicalMouseEventHandler = new NewGameEventHandler();
		addKeyListener(keyEventHandler);
		addMouseListener(mouseEventHandler);
		addMouseMotionListener(mouseEventHandler);

		// Instantiate the GameTime class
		gameTime = new GameTime();

		// Registers a new virtual-machine shutdown hook
		// Called when the program exits normally ie when the vm is terminated,
		// the user log offs or system shutdown
		Runtime.getRuntime().addShutdownHook(new Thread() {
			@Override
			public void run() {
				logger.info("Shutdown hook called");
				if (running) {
					restoreScreen();
					running = false;
				}
			}
		});
	}