public void run() {
		// setup the engine and rendering stack
		m_currentScene.initialize();
		
		// run the game
		long lastTime = System.nanoTime();
		while (m_running) {
			// update game
			if (Constants.speed == Constants.SPEED.HIGH) {
				m_currentScene.update(1.0);
			} else {
				// throttle update-loop timing to FPS
				long elapsedTime = System.nanoTime() - lastTime;
				while (elapsedTime < FRAME_FREQUENCY_NANOS)
					elapsedTime = System.nanoTime() - lastTime;
				lastTime += elapsedTime;
				double  deltaTime = elapsedTime / NANOS_PER_SECOND;
				m_currentScene.update(deltaTime);
			}
			
			// render the game
			m_currentScene.render();
			
			// escape
			if (m_currentScene.finished)
				stop();
		}
	}