Пример #1
0
        protected override void Initialize()
        {
            // create all application services and add to main services container.
            _services = new ServiceContainer();
            ServiceLocator.SetLocatorProvider(() => _services);

            var vfsStorage      = new VfsStorage();
            var pathStorage     = new FileSystemStorage("data");
            var uiAssetsStorage = new ZipStorage(pathStorage, "UI_Assets.zip");

            vfsStorage.MountInfos.Add(new VfsMountInfo(uiAssetsStorage, null));

            // Register the virtual file system as a service.
            _services.Register(typeof(IStorage), null, vfsStorage);

            // The GraphicsDeviceManager needs to be registered in the service container.
            // (This is required by the XNA content managers.)
            _services.Register(typeof(IGraphicsDeviceService), null, _graphicsDeviceManager);
            _services.Register(typeof(GraphicsDeviceManager), null, _graphicsDeviceManager);

            var uiContentManager = new StorageContentManager(_services, uiAssetsStorage);

            _services.Register(typeof(ContentManager), "UIContent", uiContentManager);

            // ----- Initialize Services
            // Register the game class.
            _services.Register(typeof(Microsoft.Xna.Framework.Game), null, this);
            _services.Register(typeof(kbPCB), null, this);

            // Input
            _inputManager = new InputManager(false);
            _services.Register(typeof(IInputService), null, _inputManager);

            // Graphics
            _graphicsManager = new GraphicsManager(GraphicsDevice, Window, uiContentManager);
            _services.Register(typeof(IGraphicsService), null, _graphicsManager);

            // GUI
            _uiManager = new UIManager(this, _inputManager);
            _services.Register(typeof(IUIService), null, _uiManager);

            // Animation
            _animationManager = new AnimationManager();
            _services.Register(typeof(IAnimationService), null, _animationManager);

            // Game logic
            _gameObjectManager = new GameObjectManager();
            _services.Register(typeof(IGameObjectService), null, _gameObjectManager);

            // Profiler
            _profiler = new HierarchicalProfiler("Main");
            _services.Register(typeof(HierarchicalProfiler), "Main", _profiler);

            // add more stuff here
            var editor2D = new Editor2D(this);

            Components.Add(editor2D);

            base.Initialize();
        }
Пример #2
0
    protected override void Initialize()
    {
      base.Initialize();

      // Get the standard XNA window.
      _gameForm = Control.FromHandle(Window.Handle) as Form;


      // Create a "virtual file system" for reading game assets.
      var titleStorage = new TitleStorage("Content");
      var assetsStorage = new ZipStorage(titleStorage, "Content.zip");
      var drStorage = new ZipStorage(titleStorage, "DigitalRune.zip");
      var vfsStorage = new VfsStorage();
      vfsStorage.MountInfos.Add(new VfsMountInfo(titleStorage, null));
      vfsStorage.MountInfos.Add(new VfsMountInfo(assetsStorage, null));
      vfsStorage.MountInfos.Add(new VfsMountInfo(drStorage, null));

      Content = new StorageContentManager(Services, vfsStorage);
#else
      Content.RootDirectory = "Content";

      // Create the DigitalRune GraphicsManager.
      _graphicsManager = new GraphicsManager(GraphicsDevice, Window, Content);

      // Add graphics service to service provider
      Services.AddService(typeof(IGraphicsService), _graphicsManager);

      // Add a few GraphicsScreens that draw stuff.
      _graphicsManager.Screens.Add(new BackgroundGraphicsScreen(_graphicsManager));
      _graphicsManager.Screens.Add(new TriangleGraphicsScreen(_graphicsManager));
      _graphicsManager.Screens.Add(new TextGraphicsScreen(_graphicsManager, Content));
    }
Пример #3
0
        /// <summary>
        /// Called when graphics resources need to be loaded. Override this method to load any
        /// game-specific graphics resources.
        /// </summary>
        protected override void LoadContent()
        {
            try
            {
                // Configure ContentManager to load the SpriteFont.
                var titleStorage = new TitleStorage("Content");
                var vfsStorage   = new VfsStorage();
                vfsStorage.MountInfos.Add(new VfsMountInfo(titleStorage, null));
#if MONOGAME
                var assetsStorage = new ZipStorage(titleStorage, "Content.zip");
                vfsStorage.MountInfos.Add(new VfsMountInfo(assetsStorage, null));
                var drStorage = new ZipStorage(titleStorage, "DigitalRune.zip");
                vfsStorage.MountInfos.Add(new VfsMountInfo(drStorage, null));
#endif
                Content = new StorageContentManager(Services, vfsStorage);

                // Load SpriteFont.
                _spriteFont  = Content.Load <SpriteFont>("SpriteFont1");
                _spriteBatch = new SpriteBatch(GraphicsDevice);
            }
            catch
            {
                // Failed to load sprite font.
            }
        }
Пример #4
0
        public MonoGameContent(string rootDirectoryName, string fileName, VfsStorage storage, StorageContentManager contentManager, object asset)
        {
            Debug.Assert(!string.IsNullOrEmpty(rootDirectoryName));
            Debug.Assert(!string.IsNullOrEmpty(fileName));
            Debug.Assert(storage != null);
            Debug.Assert(contentManager != null);
            Debug.Assert(asset != null);

            RootDirectoryName = rootDirectoryName;
            FileName          = fileName;
            Storage           = storage;
            ContentManager    = contentManager;
            Asset             = asset;
        }
Пример #5
0
        private void AddGraphicsService()
        {
            // ----- Storage
            // Create a "virtual file system" for reading game assets.
            var titleStorage       = new TitleStorage("Content");
            var assetsStorage      = new ZipStorage(titleStorage, "DigitalRune.Editor.Game.zip");
            var digitalRuneStorage = new ZipStorage(titleStorage, "DigitalRune.zip");
            var vfsStorage         = new VfsStorage();

            vfsStorage.MountInfos.Add(new VfsMountInfo(titleStorage, null));
            vfsStorage.MountInfos.Add(new VfsMountInfo(assetsStorage, null));
            vfsStorage.MountInfos.Add(new VfsMountInfo(digitalRuneStorage, null));

            // ----- Content
            _contentManager = new StorageContentManager(Editor.Services, vfsStorage);
            //_contentManager = new ContentManager(serviceContainer, "Content");
            Editor.Services.Register(typeof(ContentManager), null, _contentManager);

            // ----- Animations
            _animationManager = new AnimationManager();
            Editor.Services.Register(typeof(IAnimationService), null, _animationManager);

            // ----- Graphics
            // Create Direct3D 11 device.
            var presentationParameters = new PresentationParameters
            {
                BackBufferWidth    = 1,
                BackBufferHeight   = 1,
                DeviceWindowHandle = IntPtr.Zero
            };
            var graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef, presentationParameters);

            Editor.Services.Register(typeof(IGraphicsDeviceService), null, new GraphicsDeviceManager(graphicsDevice));

            // Create and register the graphics manager.
            _graphicsManager = new GraphicsManager(graphicsDevice, _contentManager);
            Editor.Services.Register(typeof(IGraphicsService), null, _graphicsManager);
        }
Пример #6
0
        public MyGame()
        {
            // ----- Service Container
            // The MyGame uses a ServiceContainer, which is a simple service locator
            // and Inversion of Control (IoC) container. (The ServiceContainer can be
            // replaced by any other container that implements System.IServiceProvider.)
            _serviceContainer = new ServiceContainer();
            ServiceLocator.SetLocatorProvider(() => _serviceContainer);

            // ----- Storage
            // Create a "virtual file system" for reading game assets.
            var titleStorage       = new TitleStorage("Content");
            var assetsStorage      = new ZipStorage(titleStorage, "Content.zip");
            var digitalRuneStorage = new ZipStorage(titleStorage, "DigitalRune.zip");
            var vfsStorage         = new VfsStorage();

            vfsStorage.MountInfos.Add(new VfsMountInfo(titleStorage, null));
            vfsStorage.MountInfos.Add(new VfsMountInfo(assetsStorage, null));
            vfsStorage.MountInfos.Add(new VfsMountInfo(digitalRuneStorage, null));

            // ----- Content
            _contentManager = new StorageContentManager(ServiceLocator.Current, vfsStorage);
            _serviceContainer.Register(typeof(ContentManager), null, _contentManager);

            // ----- Graphics
            // Create Direct3D 11 device.
            var presentationParameters = new PresentationParameters
            {
                BackBufferWidth  = 1,
                BackBufferHeight = 1,
                // Do not associate graphics device with any window.
                DeviceWindowHandle = IntPtr.Zero,
            };
            var graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef, presentationParameters);

            // An IGraphicsDeviceService is required by the MonoGame/XNA content manager.
            _serviceContainer.Register(typeof(IGraphicsDeviceService), null, new DummyGraphicsDeviceManager(graphicsDevice));

            // Create and register the graphics manager.
            _graphicsManager = new GraphicsManager(graphicsDevice, _contentManager);
            _serviceContainer.Register(typeof(IGraphicsService), null, _graphicsManager);

            // ----- Timing
            // We can use the CompositionTarget.Rendering event to trigger our game loop.
            // The CompositionTarget.Rendering event is raised once per frame by WPF.

            // To measure the time that has passed, we use a HighPrecisionClock.
            _clock = new HighPrecisionClock();
            _clock.Start();
            CompositionTarget.Rendering += (s, e) => _clock.Update();

            // The FixedStepTimer reads the clock and triggers the game loop at 60 Hz.
            //_timer = new FixedStepTimer(_clock)
            //{
            //  StepSize = new TimeSpan(166667), // ~60 Hz
            //  AccumulateTimeSteps = false,
            //};
            // The VariableStepTimer reads the clock and triggers the game loop as often
            // as possible.
            _timer              = new VariableStepTimer(_clock);
            _timer.TimeChanged += (s, e) => GameLoop(e.DeltaTime);
            _timer.Start();
        }
Пример #7
0
        public MonoGameContent LoadXnb(string rootDirectoryName, string fileName, bool cacheResult)
        {
            Debug.Assert(rootDirectoryName != null);
            Debug.Assert(rootDirectoryName.Length > 0);
            Debug.Assert(fileName != null);
            Debug.Assert(fileName.Length > 0);

            // Check whether content has already been loaded and is still cached.
            if (_cachedContent != null &&
                !_cachedContent.IsDisposed &&
                _cachedContent.RootDirectoryName == rootDirectoryName &&
                _cachedContent.FileName == fileName)
            {
                var result = _cachedContent;
                if (!cacheResult)
                {
                    _cachedContent = null;
                }

                return(result);
            }

            // Clear cache.
            _cachedContent?.Dispose();
            _cachedContent = null;

            // External references in MonoGame are relative to the content root directory, not the
            // model. Loading the model fails, if a external reference cannot be resolved.
            // --> Try different content root directories.
            var rootDirectory = new DirectoryInfo(rootDirectoryName);

            while (rootDirectory != null)
            {
                VfsStorage            storage = null;
                StorageContentManager content = null;
                try
                {
                    // Create a virtual file system which contains the DigitalRune effects and the content folder.
                    storage = new VfsStorage();
                    storage.MountInfos.Add(new VfsMountInfo(new ZipStorage(new TitleStorage("Content"), "DigitalRune.zip"), null));
                    storage.MountInfos.Add(new VfsMountInfo(new FileSystemStorage(rootDirectory.FullName), null));
                    content = new StorageContentManager(_services, storage);

                    string assetName = DRPath.GetRelativePath(rootDirectory.FullName, fileName);
                    var    asset     = content.Load <object>(assetName);

                    var result = new MonoGameContent(rootDirectoryName, fileName, storage, content, asset);

                    if (cacheResult)
                    {
                        _cachedContent = result;
                    }

                    return(result);
                }
                catch (Exception exception)
                {
                    storage?.Dispose();
                    content?.Dispose();

                    if (exception is ContentLoadException &&
                        exception.InnerException is ContentLoadException &&
                        rootDirectory.Parent != null)
                    {
                        // ExternalReference could probably not be resolved.
                        // --> Retry with parent folder as content root.
                    }
                    else
                    {
                        // Asset could not be loaded.
                        throw;
                    }
                }

                rootDirectory = rootDirectory.Parent;
            }

            // Execution should never reach this point.
            throw new EditorException("Unexpected error.");
        }
Пример #8
0
        public Game(ApplicationWindow window)
        {
            // ----- Service Container
            // The MyGame uses a ServiceContainer, which is a simple service locator
            // and Inversion of Control (IoC) container. (The ServiceContainer can be
            // replaced by any other container that implements System.IServiceProvider.)
            var serviceContainer = (ServiceContainer)ServiceLocator.Current;

            // ----- Storage
            // Create a "virtual file system" for reading game assets.
            var vfsStorage = new VfsStorage();

            vfsStorage.MountInfos.Add(new VfsMountInfo(new TitleStorage(String.Empty), null));

            try
            {
                vfsStorage.MountInfos.Add(new VfsMountInfo(new GZipStorage(vfsStorage, "Data.bin"), null));
                vfsStorage.MountInfos.Add(new VfsMountInfo(new GZipStorage(vfsStorage, "Kesmai.bin"), null));
                vfsStorage.MountInfos.Add(new VfsMountInfo(new GZipStorage(vfsStorage, "Stormhalter.bin"), null));
                vfsStorage.MountInfos.Add(new VfsMountInfo(new GZipStorage(vfsStorage, "UI.bin"), null));
            }
            catch
            {
                MessageBox.Show("Missing either Data.bin, Kesmai.bin, Stormhalter.bin, or UI.bin.");
                throw;
            }

            vfsStorage.Readers.Add(typeof(XDocument), new XDocumentReader());

            // ----- Content
            ContentManager contentManager = new StorageContentManager(ServiceLocator.Current, vfsStorage);

            serviceContainer.Register(typeof(IStorage), null, vfsStorage);
            serviceContainer.Register(typeof(ContentManager), null, contentManager);

#if (DEBUG)
            /* Hack to allow content reading from external library. Release builds have the types IL merged. */
            ContentTypeReaderManager.AddTypeCreator("DigitalRune.Game.UI.Content.ThemeReader", () => new ThemeReader());
            ContentTypeReaderManager.AddTypeCreator("DigitalRune.Mathematics.Content.Vector4FReader", () => new Vector4FReader());
            ContentTypeReaderManager.AddTypeCreator("DigitalRune.Game.UI.BitmapFontReader", () => new BitmapFontReader());
#endif

            // ----- Graphics
            // Create Direct3D 11 device.
            var presentationParameters = new PresentationParameters
            {
                // Do not associate graphics device with any window.
                DeviceWindowHandle = IntPtr.Zero,
            };
            var graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef, presentationParameters);

            // An IGraphicsDeviceService is required by the MonoGame/XNA content manager.
            serviceContainer.Register(typeof(IGraphicsDeviceService), null, new GraphicsDeviceManager(graphicsDevice));

            // Create and register the graphics manager.
            _graphicsManager = new GraphicsManager(graphicsDevice, contentManager);

            serviceContainer.Register(typeof(IGraphicsService), null, _graphicsManager);
            serviceContainer.Register(typeof(TerrainManager), null, new TerrainManager());

            // ----- Timing
            // We can use the CompositionTarget.Rendering event to trigger our game loop.
            // The CompositionTarget.Rendering event is raised once per frame by WPF.

            // To measure the time that has passed, we use a HighPrecisionClock.
            var clock = new HighPrecisionClock();
            clock.Start();

            CompositionTarget.Rendering += (s, e) => clock.Update();

            // The FixedStepTimer reads the clock and triggers the game loop at 60 Hz.
            //_timer = new FixedStepTimer(_clock)
            //{
            //  StepSize = new TimeSpan(166667), // ~60 Hz
            //  AccumulateTimeSteps = false,
            //};
            // The VariableStepTimer reads the clock and triggers the game loop as often
            // as possible.
            IGameTimer timer = new VariableStepTimer(clock);
            timer.TimeChanged += (s, e) => GameLoop(e.DeltaTime);
            timer.Start();
        }
Пример #9
0
        //--------------------------------------------------------------
        #region Creation & Cleanup
        //--------------------------------------------------------------

        public MyGame()
        {
            Lock = new object();

            // ----- Service Container
            // MyGame uses a ServiceContainer, which is a simple service locator and
            // Inversion of Control (IoC) container. (The ServiceContainer can be
            // replaced by any other container that implements System.IServiceProvider.)
            _serviceContainer = new ServiceContainer();
            ServiceLocator.SetLocatorProvider(() => _serviceContainer);

            _serviceContainer.Register(typeof(MyGame), null, this);

            // ----- Storage
            // Create a "virtual file system" for reading game assets.
            _titleStorage       = new TitleStorage("Content");
            _assetsStorage      = new ZipStorage(_titleStorage, "Content.zip");
            _digitalRuneStorage = new ZipStorage(_titleStorage, "DigitalRune.zip");
            _vfsStorage         = new VfsStorage();
            _vfsStorage.MountInfos.Add(new VfsMountInfo(_assetsStorage, null));
            _vfsStorage.MountInfos.Add(new VfsMountInfo(_digitalRuneStorage, null));

            // ----- Content
            _contentManager = new StorageContentManager(ServiceLocator.Current, _vfsStorage);
            _serviceContainer.Register(typeof(ContentManager), null, _contentManager);

            // ----- Graphics
            // Create Direct3D 11 device.
            var presentationParameters = new PresentationParameters
            {
                BackBufferWidth  = 1,
                BackBufferHeight = 1,
                // Do not associate graphics device with any window.
                DeviceWindowHandle = IntPtr.Zero,
            };
            var graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef, presentationParameters);

            // An IGraphicsDeviceService is required by the MonoGame/XNA content manager.
            _serviceContainer.Register(typeof(IGraphicsDeviceService), null, new DummyGraphicsDeviceManager(graphicsDevice));

            // Get DXGIOutput to call WaitForVerticalBlank() in the game loop.
            using (var dxgiFactory = new SharpDX.DXGI.Factory1())
                using (var dxgiAdapter = dxgiFactory.GetAdapter1(0))
                    _dxgiOutput = dxgiAdapter.GetOutput(0);

            // Create and register the graphics manager.
            _graphicsManager = new GraphicsManager(graphicsDevice, _contentManager);
            _serviceContainer.Register(typeof(IGraphicsService), null, _graphicsManager);

            // ----- Timing
            // The game loop runs in a parallel thread to keep the UI thread responsive.
            // To measure the time that has passed, we use a HighPrecisionClock.
            _clock = new HighPrecisionClock();
            _clock.Start();
            _gameLoopTask = ThreadPool.RunAsync(GameLoopTaskAction, WorkItemPriority.High, WorkItemOptions.TimeSliced)
                            .AsTask();

            // The FixedStepTimer reads the clock and triggers the game loop at 60 Hz.
            //_timer = new FixedStepTimer(_clock)
            //{
            //  StepSize = new TimeSpan(166667), // ~60 Hz
            //  AccumulateTimeSteps = false,
            //};

            // The VariableStepTimer reads the clock and triggers the game loop as often as possible.
            _timer = new VariableStepTimer(_clock);

            _timer.TimeChanged += (s, e) => GameLoop(e.DeltaTime);
            _timer.Start();

            CoreApplication.Suspending += OnCoreApplicationSuspending;

            // DirectX buffers only a limit amount of Present calls per frame which is controlled by
            // the MaximumFrameLatency property. The default value is usually 3. If the application
            // uses more SwapChainPresentationTargets we must increase this property.
            //var d3dDevice = (SharpDX.Direct3D11.Device)_graphicsManager.GraphicsDevice.Handle;
            //using (var dxgiDevice2 = d3dDevice.QueryInterface<SharpDX.DXGI.Device2>())
            //  dxgiDevice2.MaximumFrameLatency = numberOfSwapChainPanels;
        }
Пример #10
0
        // Initializes services and adds game components.
        protected override void Initialize()
        {
#if WINDOWS || WINDOWS_UWP || XBOX
            if (GraphicsDevice.GraphicsProfile == GraphicsProfile.Reach)
            {
                throw new NotSupportedException(
                          "The DigitalRune Samples and Content for Windows, Universal Windows Apps and Xbox 360 are " +
                          "designed for the HiDef graphics profile. A graphics cards supporting DirectX 10.0 or better " +
                          "is required.");
            }
#endif

            // ----- Service Container
            // The DigitalRune ServiceContainer is an "inversion of control" container.
            // All game services (such as input, graphics, physics, etc.) are registered
            // in this container. Other game components can access these services via lookup
            // in the service container.
            // The DigitalRune ServiceContainer replaces the XNA GameServiceContainer (see
            // property Game.Services).

            // Note: The DigitalRune libraries do not require the use of the ServiceContainer
            // or any other IoC container. The ServiceContainer is only used in the sample
            // for convenience - but it is not mandatory.
            _services = new ServiceContainer();

            // The service container is either passed directly to the game components
            // or accessed through the global variable ServiceLocator.Current.
            // The following call makes the service container publicly available in
            // ServiceLocator.Current.
            ServiceLocator.SetLocatorProvider(() => _services);

            // ----- Storage
            // For XNA the assets are stored in the following folders:
            //
            //   <gameLocation>/
            //     Content/
            //       DigitalRune/
            //         ... DigitalRune assets ...
            //       ... other assets ...
            //
            // For MonoGame the assets (*.xnb files) are stored in ZIP packages. The
            // sample assets are stored in "Content/Content.zip" and the DigitalRune
            // assets are stored in "Content/DigitalRune.zip".
            //
            //   <gameLocation>/
            //     Content/
            //       Content.zip
            //       DigitalRune.zip
            //
            // DigitalRune introduces the concept of "storages". Storages can be used
            // to access files on disk or files stored in packages (e.g. ZIP archives).
            // These storages can be mapped into a "virtual file system", which makes
            // it easier to write portable code. (The game logic can read the files
            // from the virtual file system and does not need to know the specifics
            // about the platform.)
            //
            // The virtual files system should look like this:
            //
            //   /                                     <-- root of virtual file system
            //       DigitalRune/
            //           ... DigitalRune assets ...
            //       ... other assets ...

            // The VfsStorage creates a virtual file system.
            var vfsStorage = new VfsStorage();

            // The TitleStorage reads files from the game's default storage location.
            // --> Create a TitleStorage that reads files from "<gameLocation>/Content".
            var titleStorage = new TitleStorage("Content");

#if MONOGAME
            // A ZipStorage can be used to access files inside a ZIP archive.
            // --> Mount the sample assets to the root of the virtual file system.
            var assetsStorage = new ZipStorage(titleStorage, "Content.zip");
            vfsStorage.MountInfos.Add(new VfsMountInfo(assetsStorage, null));

#if !ANDROID && !IOS && !LINUX && !MACOS
            // --> Mount the DigitalRune assets to the root of the virtual file system.
            var drStorage = new ZipStorage(titleStorage, "DigitalRune.zip");
            vfsStorage.MountInfos.Add(new VfsMountInfo(drStorage, null));
#endif
#endif

            // Finally, map the TitleStorage to the root of the virtual file system.
            // (The TitleStorage is added as the last mount point. The ZIP archives
            // have priority.)
            vfsStorage.MountInfos.Add(new VfsMountInfo(titleStorage, null));

            // Register the virtual file system as a service.
            _services.Register(typeof(IStorage), null, vfsStorage);

            // ----- Content Managers
            // The GraphicsDeviceManager needs to be registered in the service container.
            // (This is required by the XNA content managers.)
            _services.Register(typeof(IGraphicsDeviceService), null, _graphicsDeviceManager);
            _services.Register(typeof(GraphicsDeviceManager), null, _graphicsDeviceManager);

            // Register a default, shared content manager.
            // The new StorageContentManager can be used to read assets from the virtual
            // file system. (Replaces the content manager stored in Game.Content.)
            Content = new StorageContentManager(_services, vfsStorage);
            _services.Register(typeof(ContentManager), null, Content);

            // Create and register content manager that will be used to load the GUI.
#if !MONOGAME
            var uiContentManager = new ContentManager(_services, "Content");
#else
            var uiContentManager = new StorageContentManager(_services, assetsStorage);
#endif
            _services.Register(typeof(ContentManager), "UIContent", uiContentManager);

            // Create content manager that will be used exclusively by the graphics service
            // to load the pre-built effects and resources of DigitalRune.Graphics. (We
            // could use Game.Content, but it is recommended to separate the content. This
            // allows to unload the content of the samples without unloading the other
            // content.)
            var graphicsContentManager = new StorageContentManager(_services, vfsStorage);

            // ----- Initialize Services
            // Register the game class.
            _services.Register(typeof(Microsoft.Xna.Framework.Game), null, this);
            _services.Register(typeof(SampleGame), null, this);

#if XBOX
            // On Xbox, we use the XNA gamer services (e.g. for text input).
            Components.Add(new GamerServicesComponent(this));
#endif

            // Input
#if XBOX
            const bool useGamerServices = true;
#else
            const bool useGamerServices = false;
#endif
            _inputManager = new InputManager(useGamerServices);
            _services.Register(typeof(IInputService), null, _inputManager);

            // Graphics
            _graphicsManager = new GraphicsManager(GraphicsDevice, Window, graphicsContentManager);
            _services.Register(typeof(IGraphicsService), null, _graphicsManager);

            // GUI
            _uiManager = new UIManager(this, _inputManager);
            _services.Register(typeof(IUIService), null, _uiManager);

            // Animation
            _animationManager = new AnimationManager();
            _services.Register(typeof(IAnimationService), null, _animationManager);

            // Particle simulation
            _particleSystemManager = new ParticleSystemManager();
            _services.Register(typeof(IParticleSystemService), null, _particleSystemManager);

            // Physics simulation
            ResetPhysicsSimulation();

            // Game logic
            _gameObjectManager = new GameObjectManager();
            _services.Register(typeof(IGameObjectService), null, _gameObjectManager);

            // Profiler
            _profiler = new HierarchicalProfiler("Main");
            _services.Register(typeof(HierarchicalProfiler), "Main", _profiler);

            // Initialize delegates for running tasks in parallel.
            // (Creating delegates allocates memory, therefore we do this only once and
            // cache the delegates.)
            _updateAnimation = () => _animationManager.Update(_deltaTime);
            _updatePhysics   = () => _simulation.Update(_deltaTime);
            _updateParticles = () => _particleSystemManager.Update(_deltaTime);

            // SampleFramework
            // The SampleFramework automatically discovers all samples using reflection, provides
            // controls for switching samples and starts the initial sample.
#if KINECT
            var initialSample = typeof(Kinect.KinectSkeletonMappingSample);
#elif WINDOWS || WINDOWS_UWP
            var initialSample = typeof(Graphics.DeferredLightingSample);
#else
            var initialSample = typeof(Graphics.BasicEffectSample);
#endif
            _sampleFramework = new SampleFramework(this, initialSample);
            _services.Register(typeof(SampleFramework), null, _sampleFramework);

            base.Initialize();
        }