private void enterInGameScene()
        {
            State       = GameState.InGame;
            IsFinished  = false;
            IsPaused    = false;
            m_InputName = new StringBuilder("");

            // frame UI
            m_PlayGroundNode = UINode.Engine.Instance.CreateNode(new RectInt(Vector2Int.Zero, c_GameWindowSize + Vector2Int.One), null, "Playground-Node");
            var playgroundCanvas = m_PlayGroundNode.AddUIComponent <SingleColorCanvas>();

            playgroundCanvas.CanvasPixelColor = new PixelColor(ConsoleColor.Black, ConsoleColor.White);

            var playgroundLayoutNode = UINode.Engine.Instance.CreateNode(new RectInt(Vector2Int.Zero, c_GameWindowSize + Vector2Int.One), m_PlayGroundNode, "PlaygroundLayout-Node");
            var layoutBitmap         = playgroundLayoutNode.AddUIComponent <Bitmap>();

            layoutBitmap.LoadFromFile("./Assets/Layout.txt", Bitmap.DrawType.Sliced);

            // game world
            World = new World2D((Mode == GameMode.SinglePlayer)? 1 : 2, new RectInt(Vector2Int.One, c_GameWindowSize));

            // register player dead event
            AliveCounter = new HashSet <int>();
            foreach (var character in World.Characters)
            {
                int id = character.Id;
                AliveCounter.Add(id);
                character.OnDie += () => handleOnPlayerDie(id);
            }

            // game UI
            RectInt gameUISize = new RectInt(new Vector2Int(0, c_GameWindowSize.Y + 1), new Vector2Int(c_GameWindowSize.X + 1, 5));

            var uiNode = UINode.Engine.Instance.CreateNode(gameUISize, null, "Game UI");
            var canvas = uiNode.AddUIComponent <SingleColorCanvas>();

            canvas.CanvasPixelColor = new PixelColor(ConsoleColor.DarkGray, ConsoleColor.White);

            RectInt panelBounds = new RectInt(new Vector2Int(0, 0), new Vector2Int(c_GameWindowSize.X + 1, 5));

            var layoutNode = UINode.Engine.Instance.CreateNode(panelBounds, uiNode, "Game UI");
            var layout     = layoutNode.AddUIComponent <Bitmap>();

            layout.LoadFromFile("./Assets/Layout-Empty.txt", Bitmap.DrawType.Sliced);

            // register character hp , create hp ui
            m_HpTexts    = new List <TextBox>();
            m_HpBarTexts = new List <TextBox>();
            for (int i = 0; i < World.Characters.Count; i++)
            {
                var character = World.Characters[i];
                character.OnHealthChanged += (int health) => handleOnCharacterHpChanged(character.Id, health);

                var textNode = UINode.Engine.Instance.CreateNode(new RectInt(3, 1 + i * 2, 10, 1), uiNode, "Game UI");
                var text     = textNode.AddUIComponent <TextBox>();
                text.text = string.Format("P{0} HP: {1, 2}/{2, 2}", i + 1, 10, Character.c_MaxHealth);
                text.horizontalAlignment = TextBox.HorizontalAlignment.Left;
                text.verticalAlignment   = TextBox.VerticalAlignment.Middle;

                m_HpTexts.Add(text);

                var hpBarCanvasNode = UINode.Engine.Instance.CreateNode(new RectInt(18, 1 + i * 2, 20, 1), uiNode, "Game UI");
                var hpBarCanvas     = hpBarCanvasNode.AddUIComponent <SingleColorCanvas>();
                hpBarCanvas.CanvasPixelColor = new PixelColor(ConsoleColor.DarkGreen, ConsoleColor.DarkGreen);

                var hpBarBackNode = UINode.Engine.Instance.CreateNode(new RectInt(0, 0, 20, 1), hpBarCanvasNode, "Game UI - Text");
                text      = hpBarBackNode.AddUIComponent <TextBox>();
                text.text = new string("                    ");

                var hpBarInsideCanvasNode = UINode.Engine.Instance.CreateNode(new RectInt(18, 1 + i * 2, 20, 1), uiNode, "Game UI - Bar");
                var hpBarInsideCanvas     = hpBarInsideCanvasNode.AddUIComponent <SingleColorCanvas>();
                hpBarInsideCanvas.CanvasPixelColor = new PixelColor(ConsoleColor.Yellow, ConsoleColor.Yellow);

                var actualInsideTextNode = UINode.Engine.Instance.CreateNode(new RectInt(0, 0, 20, 1), hpBarInsideCanvasNode, "Game UI - Bar -Text");
                text      = actualInsideTextNode.AddUIComponent <TextBox>();
                text.text = new string("                    ");

                m_HpBarTexts.Add(text);
            }

            // add level ui
            var lvlUINode = UINode.Engine.Instance.CreateNode(new RectInt(39, 1, 10, 3), uiNode);

            m_LevelText      = lvlUINode.AddUIComponent <TextBox>();
            m_LevelText.text = "LEVEL\n000";
            m_LevelText.horizontalAlignment = TextBox.HorizontalAlignment.Center;
            m_LevelText.verticalAlignment   = TextBox.VerticalAlignment.Middle;

            World.OnTotalLevelChanged += handleOnTotalLevelChanged;

            // create Hint UI
            var hintNode = UINode.Engine.Instance.CreateNode(new RectInt(0, World.TowerTopNode.Bounds.Size.Y + 7, World.TowerTopNode.Bounds.Size.X, 1), null, "Hint-CanvasNode");

            canvas = hintNode.AddUIComponent <SingleColorCanvas>();
            canvas.CanvasPixelColor = new PixelColor(ConsoleColor.Black, ConsoleColor.DarkGray);

            var hintTextNode = UINode.Engine.Instance.CreateNode(new RectInt(0, 0, World.TowerTopNode.Bounds.Size.X, 1), hintNode, "Hint-TextBoxNode");
            var hintTextBox  = hintTextNode.AddUIComponent <TextBox>();

            hintTextBox.text = "F1: turn on/off optimized mode in game\nF2: pause/resume game";
            hintTextBox.verticalAlignment   = TextBox.VerticalAlignment.Middle;
            hintTextBox.horizontalAlignment = TextBox.HorizontalAlignment.Center;

            // create GAME OVER UI
            var gameOverNode = UINode.Engine.Instance.CreateNode(new RectInt(0, World.TowerTopNode.Bounds.Size.Y / 2, World.TowerTopNode.Bounds.Size.X + 1, 5), null, "GO-CanvasNode");

            m_GameOverCanvas = gameOverNode.AddUIComponent <SingleColorCanvas>();
            m_GameOverCanvas.CanvasPixelColor = new PixelColor(ConsoleColor.DarkRed, ConsoleColor.Yellow);

            var goUnlitBoardNode = UINode.Engine.Instance.CreateNode(new RectInt(0, 0, World.TowerTopNode.Bounds.Size.X + 1, 5), gameOverNode, "GO-UnlitNode");
            var goUnlitBox       = goUnlitBoardNode.AddUIComponent <UnlitBox>();

            goUnlitBox.UnlitCharacter = ' ';

            var goTextNode = UINode.Engine.Instance.CreateNode(new RectInt(0, 0, World.TowerTopNode.Bounds.Size.X + 1, 5), gameOverNode, "GO-TextBoxNode");

            m_GameOverText      = goTextNode.AddUIComponent <TextBox>();
            m_GameOverText.text = "GAME OVER\n\n\npress enter to confirm";
            m_GameOverText.verticalAlignment   = TextBox.VerticalAlignment.Top;
            m_GameOverText.horizontalAlignment = TextBox.HorizontalAlignment.Center;

            m_InputFieldCanvasNode = UINode.Engine.Instance.CreateNode(new RectInt(0, 2, World.TowerTopNode.Bounds.Size.X + 1, 1), gameOverNode, "InputCanvasNode");
            canvas = m_InputFieldCanvasNode.AddUIComponent <SingleColorCanvas>();
            canvas.CanvasPixelColor = new PixelColor(ConsoleColor.Red, ConsoleColor.Yellow);

            var inputUnlitBoxNode = UINode.Engine.Instance.CreateNode(new RectInt(13, 0, 24, 1), m_InputFieldCanvasNode, "InputNode");

            inputUnlitBoxNode.AddUIComponent <UnlitBox>().UnlitCharacter = ' ';

            var inputTextNode = UINode.Engine.Instance.CreateNode(new RectInt(0, 0, World.TowerTopNode.Bounds.Size.X + 1, 1), inputUnlitBoxNode, "InputNode");

            m_InputText      = inputTextNode.AddUIComponent <TextBox>();
            m_InputText.text = "PLEASE INPUT YOUR NAME";
            m_InputText.verticalAlignment   = TextBox.VerticalAlignment.Middle;
            m_InputText.horizontalAlignment = TextBox.HorizontalAlignment.Center;

            gameOverNode.IsActive           = false;
            m_InputFieldCanvasNode.IsActive = false;

            // Setup bg settings
            World.BackgroundImageNode.IsActive = !m_OptimizedMode;
        }