/// <summary>
 /// Handles the "greet" console command.
 /// </summary>
 /// <param name="args">
 /// The command arguments entered by the user. The first argument is the command name.
 /// Other arguments are optional.
 /// </param>
 private void Greet(string[] args)
 {
     if (args.Length > 1)
     {
         _console.WriteLine("Hello " + args[1] + "!");
     }
     else
     {
         _console.WriteLine("Hello!");
     }
 }
        public DebuggingComponent(Microsoft.Xna.Framework.Game game, IServiceLocator services)
            : base(game)
        {
            _inputService    = services.GetInstance <IInputService>();
            _graphicsService = services.GetInstance <IGraphicsService>();
            _uiService       = services.GetInstance <IUIService>();

            // Get graphics service and add a DelegateGraphicsScreen as the first
            // graphics screen. This lets us do the rendering in the Render method of
            // this class.

            _graphicsScreen = new DelegateGraphicsScreen(_graphicsService)
            {
                RenderCallback = Render,
            };
            _graphicsService.Screens.Insert(0, _graphicsScreen);

            // Load a UI theme and create a renderer.
            // We could use the same renderer as the "Default" screen (see StartScreenComponent.cs).
            // But usually, the debug screen will use a more efficient theme (smaller fonts, no
            // fancy graphics). Here, we simply use the BlendBlue theme again.
            var        contentManager = services.GetInstance <ContentManager>();
            var        theme          = contentManager.Load <Theme>("UI Themes/BlendBlue/Theme");
            UIRenderer renderer       = new UIRenderer(Game, theme);

            // Create a UIScreen and add it to the UI service.
            _uiScreen = new UIScreen("Debug", renderer)
            {
                // A transparent background.
                Background = new Color(0, 0, 0, 0),

                // The z-index is equal to the draw order. The z-index defines in which order the
                // screens are updated. This screen with the debug console should be updated before
                // the actual game under this screen.
                ZIndex = 10,

                // Hide the screen. The user has to press a button to make the debug screen visible.
                IsVisible = false,
            };

            // Optional:
            // The debug screen handles gamepad input first, then the other screens and game components
            // can handle input. We do not want that the game is controllable when the debug screen is
            // visible, therefore we set the IsHandled flags when the screen is finished with the input.
            _uiScreen.InputProcessed += (s, e) => _inputService.SetGamePadHandled(LogicalPlayerIndex.Any, true);

            // Add a console control on the left.
            _console = new Console
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Stretch,
                Width  = 500,
                Margin = new Vector4(20),
            };
            _uiScreen.Children.Add(_console);

            // Print a few info messages in the console.
            _console.WriteLine("Press TAB or ChatPadGreen to display/hide console.");
            _console.WriteLine("Enter 'help' to view console commands.");

            // Add a custom command:
            _console.Interpreter.Commands.Add(new ConsoleCommand("greet", "greet [<name>] ... Prints a greeting message.", Greet));

            // Add the screen to the UI service.
            _uiService.Screens.Add(_uiScreen);
        }