Ejemplo n.º 1
0
        protected override async Task LoadContent()
        {
            await base.LoadContent();

            var sprites = Content.Load <SpriteSheet>("UIImages");

            element1 = new Button {
                Name = "1", Width = 300, Height = 150
            };
            element1.PressedImage    = SpriteFromSheet.Create(sprites, "Logo");
            element1.NotPressedImage = SpriteFromSheet.Create(sprites, "BorderButton");
            element1.DependencyProperties.Set(Canvas.AbsolutePositionPropertyKey, new Vector3(350, 300, 0));
            element1.DependencyProperties.Set(Panel.ZIndexPropertyKey, 1);

            element2 = new Button {
                Name = "2", Width = 600, Height = 300
            };
            element2.DependencyProperties.Set(Canvas.AbsolutePositionPropertyKey, new Vector3(200, 100, -50));
            element2.DependencyProperties.Set(Panel.ZIndexPropertyKey, 0);
            element2.PressedImage    = (SpriteFromTexture) new Sprite(Content.Load <Texture>("ImageButtonPressed"));
            element2.NotPressedImage = (SpriteFromTexture) new Sprite(Content.Load <Texture>("ImageButtonNotPressed"));

            var canvas = new Canvas();

            canvas.Children.Add(element1);
            canvas.Children.Add(element2);

            UIComponent.Page = new Engine.UIPage {
                RootElement = canvas
            };
        }
Ejemplo n.º 2
0
        public void SpriteFromSheetTests()
        {
            var fromNullSheet = new SpriteFromSheet();

            Assert.Equal(0, fromNullSheet.SpritesCount);
            Assert.Null(fromNullSheet.GetSprite());

            var emptySheet     = new SpriteSheet();
            var fromEmptySheet = new SpriteFromSheet {
                Sheet = emptySheet
            };

            Assert.Equal(0, fromEmptySheet.SpritesCount);
            Assert.Null(fromEmptySheet.GetSprite());

            var validSheet = new SpriteSheet {
                Sprites = { new Sprite("0"), new Sprite("1") }
            };
            var fromValidSheet = new SpriteFromSheet {
                Sheet = validSheet
            };

            Assert.Equal(2, fromValidSheet.SpritesCount);
            for (var i = 0; i < fromValidSheet.SpritesCount; i++)
            {
                fromValidSheet.CurrentFrame = i;
                Assert.Equal(i.ToString(), fromValidSheet.GetSprite().Name);
            }
        }
Ejemplo n.º 3
0
        public void SpriteFromSheetTests()
        {
            var fromNullSheet = new SpriteFromSheet();

            Assert.AreEqual(0, fromNullSheet.SpritesCount);
            Assert.IsNull(fromNullSheet.GetSprite(0));

            var emptySheet     = new SpriteSheet();
            var fromEmptySheet = new SpriteFromSheet {
                Sheet = emptySheet
            };

            Assert.AreEqual(0, fromEmptySheet.SpritesCount);
            Assert.IsNull(fromEmptySheet.GetSprite(0));

            var validSheet = new SpriteSheet()
            {
                Sprites = { new Sprite("0"), new Sprite("1") }
            };
            var fromValidSheet = new SpriteFromSheet {
                Sheet = validSheet
            };

            Assert.AreEqual(2, fromValidSheet.SpritesCount);
            for (int i = 0; i < fromValidSheet.SpritesCount; i++)
            {
                Assert.AreEqual(i.ToString(), fromValidSheet.GetSprite(i).Name);
            }
        }
Ejemplo n.º 4
0
        protected override async Task LoadContent()
        {
            await base.LoadContent();

            var sprites = Content.Load <SpriteSheet>("RotatedImages");
            var img1    = new ImageElement {
                Source = SpriteFromSheet.Create(sprites, "NRNR"), StretchType = StretchType.Fill
            };
            var img2 = new ImageElement {
                Source = SpriteFromSheet.Create(sprites, "RNR"), StretchType = StretchType.Fill
            };
            var img3 = new ImageElement {
                Source = SpriteFromSheet.Create(sprites, "NRR"), StretchType = StretchType.Fill
            };
            var img4 = new ImageElement {
                Source = SpriteFromSheet.Create(sprites, "RR"), StretchType = StretchType.Fill
            };

            img1.SetGridColumnSpan(2);
            img2.SetGridColumnSpan(2);
            img2.SetGridRow(1);
            img3.SetGridRowSpan(2);
            img3.SetGridColumn(2);
            img4.SetGridRowSpan(2);
            img4.SetGridColumn(3);

            var grid = new UniformGrid
            {
                Rows     = 2,
                Columns  = 4,
                Children = { img1, img2, img3, img4 }
            };

            UIComponent.RootElement = grid;
        }
Ejemplo n.º 5
0
        protected override async Task LoadContent()
        {
            await base.LoadContent();

            var sprites = Content.Load <SpriteSheet>("UIImages");

            var img1 = new ImageElement {
                Name = "UV 1 stack panel", Source = (SpriteFromTexture) new Sprite(Content.Load <Texture>("uv"))
            };
            var img2 = new ImageElement {
                Name = "UV 2 stack panel", Source = (SpriteFromTexture) new Sprite(Content.Load <Texture>("uv"))
            };

            img3 = new ImageElement {
                Name = "UV 3 stack panel", Source = (SpriteFromTexture) new Sprite(Content.Load <Texture>("uv"))
            };

            stackPanel = new StackPanel {
                Orientation = Orientation.Vertical
            };
            stackPanel.Children.Add(img1);
            stackPanel.Children.Add(img2);
            stackPanel.Children.Add(img3);

            var img4 = new ImageElement {
                Name = "UV grid", Source = (SpriteFromTexture) new Sprite(Content.Load <Texture>("uv"))
            };
            var img5 = new ImageElement {
                Name = "UV grid 2", Source = (SpriteFromTexture) new Sprite(Content.Load <Texture>("uv"))
            };
            var img6 = new ImageElement {
                Name = "Game screen grid", Source = SpriteFromSheet.Create(sprites, "GameScreen")
            };

            img4.DependencyProperties.Set(GridBase.ColumnPropertyKey, 0);
            img4.DependencyProperties.Set(GridBase.RowPropertyKey, 0);
            img5.DependencyProperties.Set(GridBase.ColumnPropertyKey, 1);
            img5.DependencyProperties.Set(GridBase.RowPropertyKey, 0);
            img6.DependencyProperties.Set(GridBase.ColumnPropertyKey, 0);
            img6.DependencyProperties.Set(GridBase.RowPropertyKey, 1);
            img6.DependencyProperties.Set(GridBase.ColumnSpanPropertyKey, 2);

            grid = new UniformGrid {
                Columns = 2, Rows = 2
            };
            grid.Children.Add(img4);
            grid.Children.Add(img5);
            grid.Children.Add(img6);

            scrollViewer = new ScrollViewer {
                Content = grid, ScrollMode = ScrollingMode.HorizontalVertical
            };

            contentDecorator = new ContentDecorator {
                Content = scrollViewer
            };

            UIComponent.RootElement = contentDecorator;
        }
Ejemplo n.º 6
0
        protected override async Task LoadContent()
        {
            await base.LoadContent();

            var random = new Random(0);

            var sprites = Content.Load <SpriteSheet>("UIImages");
            var img1    = new ImageElement {
                Source = (SpriteFromTexture) new Sprite(Content.Load <Texture>("uv"))
            };
            var img2 = new ImageElement {
                Source = SpriteFromSheet.Create(sprites, "GameScreenLeft")
            };
            var img3 = new ImageElement {
                Source = SpriteFromSheet.Create(sprites, "GameScreenRight")
            };

            stackPanel1 = new StackPanel {
                Orientation = Orientation.Vertical, ItemVirtualizationEnabled = true
            };
            stackPanel1.Children.Add(img1);
            stackPanel1.Children.Add(img2);
            stackPanel1.Children.Add(img3);

            stackPanel2 = new StackPanel {
                Orientation = Orientation.Vertical, ItemVirtualizationEnabled = true
            };
            for (var i = 0; i < 1000; i++)
            {
                stackPanel2.Children.Add(CreateButton("" + i, 75, "button number " + i));
            }

            stackPanel3 = new StackPanel {
                Orientation = Orientation.Vertical, ItemVirtualizationEnabled = true, VerticalAlignment = VerticalAlignment.Center
            };
            for (var i = 0; i < 103; i++)
            {
                stackPanel3.Children.Add(CreateButton("" + i, 50 + 500 * random.NextFloat(), "random button number " + i));
            }

            stackPanel4 = new StackPanel {
                Orientation = Orientation.Vertical, ItemVirtualizationEnabled = true
            };
            for (var i = 0; i < 5; i++)
            {
                stackPanel4.Children.Add(CreateButton("" + i, i * 30, "random button number "));
            }

            currentStackPanel = stackPanel1;

            scrollViewer = new ScrollViewer {
                Name = "sv", Content = currentStackPanel, ScrollMode = ScrollingMode.Vertical
            };

            UIComponent.Page = new Engine.UIPage {
                RootElement = scrollViewer
            };
        }
Ejemplo n.º 7
0
        protected override async Task LoadContent()
        {
            await base.LoadContent();

            var uiGroup = Content.Load <SpriteSheet>("UIImages");

            element4 = new ContentDecorator
            {
                Name = "4",
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Width           = 200, Height = 100,
                LocalMatrix     = Matrix.Translation(-50, -50, 0),
                BackgroundImage = SpriteFromSheet.Create(uiGroup, "uvNotRotated")
            };

            element3 = new ContentDecorator
            {
                Name = "3",
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Width           = 300, Height = 150,
                Content         = element4,
                LocalMatrix     = Matrix.Translation(-200, -100, 0),
                BackgroundImage = SpriteFromSheet.Create(uiGroup, "uvRotated90")
            };

            element2 = new ContentDecorator
            {
                Name = "2",
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Width           = 600, Height = 300,
                Content         = element3,
                BackgroundImage = SpriteFromSheet.Create(uiGroup, "BorderButton")
            };
            element2.DependencyProperties.Set(Canvas.AbsolutePositionPropertyKey, new Vector3(400, 200, 0));
            element2.DependencyProperties.Set(Panel.ZIndexPropertyKey, 1);

            element1 = new ContentDecorator
            {
                Name = "1",
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Width           = 600, Height = 300,
                BackgroundImage = SpriteFromSheet.Create(uiGroup, "GameScreen")
            };

            var canvas = new Canvas();

            canvas.Children.Add(element1);
            canvas.Children.Add(element2);

            UIComponent.Page = new Engine.UIPage {
                RootElement = canvas
            };
        }
Ejemplo n.º 8
0
        protected override void LoadScene()
        {
            popupWindowImage = SpriteFromSheet.Create(MainSceneImages, "popup_window");

            // Preload stars
            starSprites.Add(MainSceneImages["star0"]);
            starSprites.Add(MainSceneImages["star1"]);
            starSprites.Add(MainSceneImages["star2"]);
            starSprites.Add(MainSceneImages["star3"]);
            borderStarImages.Add(MainSceneImages["bstar0"]);
            borderStarImages.Add(MainSceneImages["bstar1"]);
            borderStarImages.Add(MainSceneImages["bstar2"]);
            borderStarImages.Add(MainSceneImages["bstar3"]);

            // Create space ships
            var random = new Random();

            for (var i = 0; i < ShipNameList.Count; i++)
            {
                shipList.Add(new SpaceShip
                {
                    Name     = ShipNameList[i],
                    Power    = random.Next(4),
                    Control  = random.Next(4),
                    Speed    = random.Next(4),
                    IsLocked = (i % 3) == 2,
                });
            }

            var mainStackPanel = CreateMainScene();

            CreateWelcomePopup();
            CreateShipSelectionPopup();

            // Create the background
            var background = new ImageElement {
                Source = SpriteFromSheet.Create(MainSceneImages, "background_uiimage"), StretchType = StretchType.Fill
            };

            background.SetPanelZIndex(-1);

            // Overlay pop-ups and the main screen
            var overlay = new UniformGrid();

            overlay.Children.Add(background);
            overlay.Children.Add(mainStackPanel);
            overlay.Children.Add(welcomePopup);
            overlay.Children.Add(shipSelectPopup);

            // Set the root element to the overall overlay
            var uiComponent = Entity.Get <UIComponent>();

            uiComponent.RootElement = overlay;

            Script.AddTask(FillLifeBar);
        }
Ejemplo n.º 9
0
        private void SetSliderImages(bool setRotatedImages)
        {
            var suffix = setRotatedImages ? "Rotated" : "";

            slider.TrackBackgroundImage = SpriteFromSheet.Create(sliderImages, "Background" + suffix);
            slider.TrackForegroundImage = SpriteFromSheet.Create(sliderImages, "Foreground" + suffix);
            slider.ThumbImage           = SpriteFromSheet.Create(sliderImages, "Thumb" + suffix);
            slider.MouseOverThumbImage  = SpriteFromSheet.Create(sliderImages, "ThumbOverred" + suffix);
            slider.TickImage            = SpriteFromSheet.Create(sliderImages, "Tick" + suffix);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Load resource and construct ui components
        /// </summary>
        public override void Start()
        {
            // Load resources shared by different UI screens
            buttonImage = SpriteFromSheet.Create(UIImages, "button");

            // Load and create specific UI screens.
            CreateMainMenuUI();
            CreateGameUI();
            CreateGameOverUI();
        }
Ejemplo n.º 11
0
 private static Entity CreateSpriteEntity(SpriteSheet sheet, string frameName)
 {
     return(new Entity(frameName)
     {
         new SpriteComponent
         {
             SpriteProvider = SpriteFromSheet.Create(sheet, frameName)
         }
     });
 }
Ejemplo n.º 12
0
        public override void Start()
        {
            physics        = Entity.Get <RigidbodyComponent>();
            robotLight     = Entity.Get <RobotLight>();
            robotHolder    = Entity.Get <RobotHolder>();
            robotLaser     = Entity.Get <RobotLaser>();
            spriteProvider = Entity.Get <SpriteComponent>().SpriteProvider as SpriteFromSheet;

            robotLight.UpdateTransform(direction);
            UpdateSprite(direction);
        }
Ejemplo n.º 13
0
        private UIElement CreateMainSceneShipStatusStars(string imageName, UIElement content, int rowIndex)
        {
            var item = new ContentDecorator
            {
                Content             = content,
                BackgroundImage     = SpriteFromSheet.Create(MainSceneImages, imageName),
                HorizontalAlignment = HorizontalAlignment.Center
            };

            item.SetGridRow(rowIndex);

            return(item);
        }
Ejemplo n.º 14
0
        public override void Start()
        {
            _characterSpriteSheet     = Entity.Get <SpriteComponent>().SpriteProvider as SpriteFromSheet;
            _characterSpriteComponent = Entity.Get <SpriteComponent>();
            _characterEntity          = SceneSystem.SceneInstance.Scene.Entities.First(e => e.Name == "Character");

            //_characterEntity.Transform.Scale = new Vector3(1f, 1f, 1);

            _bufferWidth  = GraphicsDevice.Presenter.Description.BackBufferWidth;
            _bufferHeight = GraphicsDevice.Presenter.Description.BackBufferHeight;

            Initialize();
        }
Ejemplo n.º 15
0
        private Entity CreateSpriteEntity(SpriteSheet sheet, string frameName)
        {
            var entity = new Entity(frameName)
            {
                new SpriteComponent
                {
                    SpriteProvider = SpriteFromSheet.Create(sheet, frameName)
                }
            };

            entities.Add(entity);

            return(entity);
        }
Ejemplo n.º 16
0
        private void CreateMainMenuUI()
        {
            var strideLogo = new ImageElement {
                Source = SpriteFromSheet.Create(UIImages, "sd_logo")
            };

            strideLogo.SetCanvasPinOrigin(new Vector3(0.5f, 0.5f, 1f));
            strideLogo.SetCanvasRelativeSize(new Vector3(0.75f, 0.5f, 1f));
            strideLogo.SetCanvasRelativePosition(new Vector3(0.5f, 0.3f, 1f));

            var startButton = new Button
            {
                Content = new TextBlock
                {
                    Font                = Font,
                    Text                = "Touch to Start",
                    TextColor           = Color.Black,
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment   = VerticalAlignment.Center
                },
                NotPressedImage = buttonImage,
                PressedImage    = buttonImage,
                MouseOverImage  = buttonImage,
                Padding         = new Thickness(77, 30, 25, 30),
                MinimumWidth    = 250f,
            };

            startButton.SetCanvasPinOrigin(new Vector3(0.5f, 0.5f, 1f));
            startButton.SetCanvasRelativePosition(new Vector3(0.5f, 0.7f, 0f));
            startButton.Click += (sender, args) =>
            {
                GameGlobals.GameStartedEventKey.Broadcast();
                StartGameMode();
            };

            var mainMenuCanvas = new Canvas();

            mainMenuCanvas.Children.Add(strideLogo);
            mainMenuCanvas.Children.Add(startButton);

            mainMenuRoot = new ModalElement
            {
                HorizontalAlignment = HorizontalAlignment.Stretch,
                VerticalAlignment   = VerticalAlignment.Stretch,
                Content             = mainMenuCanvas
            };
        }
Ejemplo n.º 17
0
        private Entity CreateSpriteEntity(SpriteSheet sheet, string frameName, bool addToScene = true)
        {
            var entity = new Entity(frameName)
            {
                new SpriteComponent
                {
                    SpriteProvider = SpriteFromSheet.Create(sheet, frameName)
                }
            };

            if (addToScene)
            {
                entities.Add(entity);
            }

            return(entity);
        }
Ejemplo n.º 18
0
        private Button CreateTextButton(string text)
        {
            var buttonImage = SpriteFromSheet.Create(MainSceneImages, "button0");

            return(new Button
            {
                NotPressedImage = buttonImage,
                PressedImage = buttonImage,
                MouseOverImage = buttonImage,
                Content = new TextBlock
                {
                    Font = WesternFont,
                    TextColor = Color.White,
                    Text = text,
                },
                Padding = new Thickness(90, 30, 25, 35),
            });
        }
Ejemplo n.º 19
0
        private void CreateGameUI()
        {
            distanceTextBlock = new TextBlock {
                Font = Font, TextColor = Color.Gold, VerticalAlignment = VerticalAlignment.Center
            };
            distanceTextBlock.SetCanvasPinOrigin(new Vector3(0.5f, 0.5f, 1f));
            distanceTextBlock.SetCanvasRelativePosition(new Vector3(0.2f, 0.05f, 0f));

            var scoreBoard = new ContentDecorator
            {
                BackgroundImage = SpriteFromSheet.Create(UIImages, "distance_bg"),
                Content         = distanceTextBlock,
                Padding         = new Thickness(60, 31, 25, 35),
                MinimumWidth    = 290f // Set the minimum width of score button so that it wont modify when the content (text) changes, and less than minimum.
            };

            gameRoot = new Canvas();
            gameRoot.Children.Add(scoreBoard);
        }
Ejemplo n.º 20
0
        private UIElement CreateBottomBar()
        {
            // Create Life bar
            lifeBarGaugeImage = ButtonsImages["rope_small"];
            gaugeBarRegion    = lifeBarGaugeImage.Region;

            var lifebarGauge = new ImageElement
            {
                Name        = "LifeBarBackground",
                Source      = SpriteFromSheet.Create(ButtonsImages, "rope_small"),
                StretchType = StretchType.Fill,
            };

            lifebarGauge.SetGridColumn(1);

            lifeBarGrid = new Grid();
            lifeBarGrid.Children.Add(lifebarGauge);
            lifeBarGrid.ColumnDefinitions.Add(new StripDefinition(StripType.Fixed, 8));
            lifeBarGrid.ColumnDefinitions.Add(new StripDefinition(StripType.Star, 0));
            lifeBarGrid.ColumnDefinitions.Add(new StripDefinition(StripType.Star, 100));
            lifeBarGrid.ColumnDefinitions.Add(new StripDefinition(StripType.Fixed, 8));
            lifeBarGrid.RowDefinitions.Add(new StripDefinition());
            lifeBarGrid.LayerDefinitions.Add(new StripDefinition());
            lifeBarGrid.SetCanvasRelativePosition(new Vector3(0f, 0.185f, 0f));
            lifeBarGrid.SetCanvasRelativeSize(new Vector3(1f, 1f, 1f));
            lifeBarGrid.SetPanelZIndex(-1);


            // the main grid of the top bar
            var mainLayer = new Canvas
            {
                VerticalAlignment = VerticalAlignment.Top,
                MaximumHeight     = 10
            };

            mainLayer.Children.Add(lifeBarGrid);

            return(mainLayer);
        }
Ejemplo n.º 21
0
        private void CreateMainMenuUI()
        {
            var xenkoLogo = new ImageElement {
                Source = SpriteFromSheet.Create(UIImages, "xk_logo")
            };

            xenkoLogo.SetCanvasPinOrigin(new Vector3(0.5f, 0.5f, 1f));
            xenkoLogo.SetCanvasRelativeSize(new Vector3(0.75f, 0.5f, 1f));
            xenkoLogo.SetCanvasRelativePosition(new Vector3(0.5f, 0.3f, 1f));

            StartButton = new Button
            {
                Content = new TextBlock {
                    Font = Font, Text = "Touch to Start", TextColor = Color.Black,
                    HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center
                },
                NotPressedImage = buttonImage,
                PressedImage    = buttonImage,
                MouseOverImage  = buttonImage,
                Padding         = new Thickness(77, 30, 25, 30),
                MinimumWidth    = 250f,
            };

            StartButton.SetCanvasPinOrigin(new Vector3(0.5f, 0.5f, 1f));
            StartButton.SetCanvasRelativePosition(new Vector3(0.5f, 0.7f, 0f));

            var mainMenuCanvas = new Canvas();

            mainMenuCanvas.Children.Add(xenkoLogo);
            mainMenuCanvas.Children.Add(StartButton);

            mainMenuRoot = new ModalElement
            {
                HorizontalAlignment = HorizontalAlignment.Stretch,
                VerticalAlignment   = VerticalAlignment.Stretch,
                Content             = mainMenuCanvas
            };
        }
Ejemplo n.º 22
0
        private Button CreateIncreaseStatusButton(string text, int rowIndex, int columnIndex, int moneyCost, int bonuscost, Func <int> getProperty, Action setProperty)
        {
            var button = new Button
            {
                NotPressedImage = SpriteFromSheet.Create(MainSceneImages, "small_display_element"),
                MouseOverImage  = SpriteFromSheet.Create(MainSceneImages, "small_display_element"),
                PressedImage    = SpriteFromSheet.Create(MainSceneImages, "small_display_element_pressed"),
                MinimumWidth    = 80,
                Name            = text,
                Content         = new TextBlock
                {
                    Font                = WesternFont,
                    TextColor           = Color.Black,
                    Text                = text,
                    TextSize            = 54,
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment   = VerticalAlignment.Center
                },
                Padding = new Thickness(22, 11, 22, 15)
            };

            button.SetGridColumn(columnIndex);
            button.SetGridRow(rowIndex);

            button.Click += delegate
            {
                if (!CanPurchase(moneyCost, bonuscost) || getProperty() >= MaximumStar)
                {
                    return;
                }

                setProperty();
                PurchaseWithBonus(bonuscost);
                PurchaseWithMoney(moneyCost);
            };

            return(button);
        }
Ejemplo n.º 23
0
        public override async Task Execute()
        {
            spriteSheet          = BulletSheet;
            agentSpriteComponent = Entity.Get <SpriteComponent>();
            var animComponent = Entity.Get <AnimationComponent>();
            PlayingAnimation playingAnimation = null;

            // Calculate offset of the bullet from the Agent if he is facing left and right side // TODO improve this
            var bulletOffset = new Vector3(1.3f, 1.65f, 0f);

            // Initialize game entities
            if (!IsLiveReloading)
            {
                shootDelayCounter     = 0f;
                isAgentFacingRight    = true;
                currentAgentAnimation = AgentAnimation.Idle;
            }
            CurrentAgentAnimation = currentAgentAnimation;

            var normalScaleX = Entity.Transform.Scale.X;

            var bulletCS = BulletColliderShape;

            Task animTask = null;

            while (Game.IsRunning)
            {
                await Script.NextFrame();

                var inputState = GetKeyboardInputState();

                if (inputState == InputState.None)
                {
                    inputState = GetPointerInputState();
                }

                if (inputState == InputState.RunLeft || inputState == InputState.RunRight)
                {
                    // Update Agent's position
                    var dt = (float)Game.UpdateTime.Elapsed.TotalSeconds;

                    Entity.Transform.Position.X += ((inputState == InputState.RunRight) ? AgentMoveDistance : -AgentMoveDistance) * dt;

                    if (Entity.Transform.Position.X < -gameWidthHalfX)
                    {
                        Entity.Transform.Position.X = -gameWidthHalfX;
                    }

                    if (Entity.Transform.Position.X > gameWidthHalfX)
                    {
                        Entity.Transform.Position.X = gameWidthHalfX;
                    }

                    isAgentFacingRight = inputState == InputState.RunRight;

                    // If agent face left, flip the sprite
                    Entity.Transform.Scale.X = isAgentFacingRight ? normalScaleX : -normalScaleX;

                    // Update the sprite animation and state
                    CurrentAgentAnimation = AgentAnimation.Run;
                    if (playingAnimation == null || playingAnimation.Name != "Run")
                    {
                        playingAnimation = animComponent.Play("Run");
                    }
                }
                else if (inputState == InputState.Shoot)
                {
                    if (animTask != null && !animTask.IsCompleted)
                    {
                        continue;
                    }
                    if (animTask != null && animTask.IsCompleted)
                    {
                        playingAnimation = null;
                    }

                    animTask = null;

                    var rb = new RigidbodyComponent {
                        CanCollideWith = CollisionFilterGroupFlags.CustomFilter1, CollisionGroup = CollisionFilterGroups.DefaultFilter
                    };
                    rb.ColliderShapes.Add(new ColliderShapeAssetDesc {
                        Shape = bulletCS
                    });

                    // Spawns a new bullet
                    var bullet = new Entity
                    {
                        new SpriteComponent {
                            SpriteProvider = SpriteFromSheet.Create(spriteSheet, "bullet")
                        },
                        rb,
                        new BeamScript()
                    };
                    bullet.Name = "bullet";

                    bullet.Transform.Position = (isAgentFacingRight) ? Entity.Transform.Position + bulletOffset : Entity.Transform.Position + (bulletOffset * new Vector3(-1, 1, 1));
                    bullet.Transform.UpdateWorldMatrix();

                    SceneSystem.SceneInstance.RootScene.Entities.Add(bullet);

                    rb.LinearFactor  = new Vector3(1, 0, 0);
                    rb.AngularFactor = new Vector3(0, 0, 0);
                    rb.ApplyImpulse(isAgentFacingRight ? new Vector3(25, 0, 0) : new Vector3(-25, 0, 0));

                    // Start animation for shooting
                    CurrentAgentAnimation = AgentAnimation.Shoot;
                    if (playingAnimation == null || playingAnimation.Name != "Attack")
                    {
                        playingAnimation = animComponent.Play("Attack");
                        animTask         = animComponent.Ended(playingAnimation);
                    }
                }
                else
                {
                    CurrentAgentAnimation = AgentAnimation.Idle;
                    if (playingAnimation == null || playingAnimation.Name != "Stance")
                    {
                        playingAnimation = animComponent.Play("Stance");
                    }
                }
            }
        }
Ejemplo n.º 24
0
 /// <summary>
 /// Creates a new instance of <see cref="SpriteComponent"/>
 /// </summary>
 public SpriteComponent()
 {
     SpriteProvider     = new SpriteFromSheet();
     PremultipliedAlpha = true;
 }
Ejemplo n.º 25
0
        private UIElement CreateMainScene()
        {
            // the top life bar
            var topBar = CreateMainScreneTopBar();

            // Create Name label
            nameTextBlock = new TextBlock
            {
                Font                = WesternFont,
                TextSize            = 52,
                TextColor           = Color.LightGreen,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center,
                Margin              = new Thickness(50, 0, 50, 0)
            };
            var nameLabel = new ContentDecorator
            {
                BackgroundImage     = SpriteFromSheet.Create(MainSceneImages, "tex_edit_inactivated_background"),
                Content             = nameTextBlock,
                Padding             = new Thickness(20, 15, 20, 20),
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center
            };

            nameLabel.SetGridRow(1);

            // Create Character image
            var characterImage = new ImageElement
            {
                Name   = "HeroImage",
                Source = SpriteFromSheet.Create(MainSceneImages, "character"),
                HorizontalAlignment = HorizontalAlignment.Center,
            };

            characterImage.SetGridRow(2);

            // Create Explanation TextBlock
            var explanationLabel = new ContentDecorator
            {
                BackgroundImage     = SpriteFromSheet.Create(MainSceneImages, "description_frame"),
                HorizontalAlignment = HorizontalAlignment.Center,
                Content             = new TextBlock
                {
                    Font                = JapaneseFont,
                    TextSize            = 28,
                    TextColor           = Color.White,
                    Text                = "Pictogram-based alphabets are easily supported.\n日本語も簡単に入れることが出来ます。",
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment   = VerticalAlignment.Center,
                    WrapText            = true
                },
                Padding = new Thickness(50, 30, 50, 40),
            };

            explanationLabel.SetGridRow(3);

            // The ship status panel
            var shipStatusPanel = CreateMainSceneShipStatusPanel();

            shipStatusPanel.SetGridRow(4);

            // Create quit button (Last element)
            var quitButton = CreateTextButton("Quit Sample");

            quitButton.HorizontalAlignment = HorizontalAlignment.Center;
            quitButton.VerticalAlignment   = VerticalAlignment.Center;
            quitButton.Click += delegate { UIGame.Exit(); };
            quitButton.SetGridRow(5);

            // Put region together in the main grid
            var mainLayout = new Grid();

            mainLayout.ColumnDefinitions.Add(new StripDefinition());
            mainLayout.RowDefinitions.Add(new StripDefinition(StripType.Star, 15));
            mainLayout.RowDefinitions.Add(new StripDefinition(StripType.Star, 10));
            mainLayout.RowDefinitions.Add(new StripDefinition(StripType.Star, 20));
            mainLayout.RowDefinitions.Add(new StripDefinition(StripType.Star, 20));
            mainLayout.RowDefinitions.Add(new StripDefinition(StripType.Star, 25));
            mainLayout.RowDefinitions.Add(new StripDefinition(StripType.Star, 10));
            mainLayout.LayerDefinitions.Add(new StripDefinition());

            // set minimal and maximal size of rows
            mainLayout.RowDefinitions[0].MaximumSize = topBar.MaximumHeight;
            mainLayout.RowDefinitions[1].MinimumSize = 100;
            mainLayout.RowDefinitions[3].MinimumSize = 120;
            mainLayout.RowDefinitions[5].MinimumSize = 90;

            mainLayout.Children.Add(topBar);
            mainLayout.Children.Add(nameLabel);
            mainLayout.Children.Add(characterImage);
            mainLayout.Children.Add(explanationLabel);
            mainLayout.Children.Add(shipStatusPanel);
            mainLayout.Children.Add(quitButton);


            return(mainLayout);
        }
Ejemplo n.º 26
0
        protected override void LoadScene()
        {
            // Allow user to resize the window with the mouse.
            Game.Window.AllowUserResizing = true;

            // Create and initialize "Stride Samples" Text
            var strideSampleTextBlock = new ContentDecorator
            {
                BackgroundImage = SpriteFromSheet.Create(SplashScreenImages, "stride_sample_text_bg"),
                Content         = new TextBlock
                {
                    Font      = WesternFont,
                    TextSize  = 60,
                    Text      = "Stride UI Particles",
                    TextColor = Color.White,
                },
                Padding             = new Thickness(35, 15, 35, 25),
                HorizontalAlignment = HorizontalAlignment.Center
            };

            strideSampleTextBlock.SetPanelZIndex(1);


            //*********************************
            // Confetti button
            var buttonImage = SpriteFromSheet.Create(SplashScreenImages, "button_long");

            var strideButtonConfetti = new Button
            {
                NotPressedImage = buttonImage,
                PressedImage    = buttonImage,
                MouseOverImage  = buttonImage,

                Content = new TextBlock
                {
                    Font      = WesternFont,
                    TextColor = Color.White,
                    Text      = "Click here to start the game over",
                    TextSize  = 24
                },

                HorizontalAlignment = HorizontalAlignment.Right,
                Padding             = new Thickness(90, 22, 25, 35),
//                BackgroundColor = Color.DarkOrchid
            };

            strideButtonConfetti.SetPanelZIndex(1);
            strideButtonConfetti.SetGridRow(1);

            strideButtonConfetti.Click += delegate
            {
                fusePercentage = 1f;
                desiredState   = GameState.NewGame;
                var effectOffset = new Vector3(45 - strideButtonConfetti.RenderSize.X / 2, -5, 0);
                SpawnParticles(strideButtonConfetti.WorldMatrix.TranslationVector + effectOffset, Prefab, 2f);
            };
            //*********************************

            //*********************************
            // Stars button
            var buttonStars = SpriteFromSheet.Create(SplashScreenImages, "button_short");

            var strideButtonStars = new Button
            {
                NotPressedImage = buttonStars,
                PressedImage    = buttonStars,
                MouseOverImage  = buttonStars,

                Content = new TextBlock
                {
                    Font      = WesternFont,
                    TextColor = Color.White,
                    Text      = "Congratulations",
                    TextSize  = 24
                },

                HorizontalAlignment = HorizontalAlignment.Right,
                Padding             = new Thickness(90, 22, 25, 35),
//                BackgroundColor = Color.DarkOrchid
            };

            strideButtonStars.SetPanelZIndex(1);
            strideButtonStars.SetGridRow(4);

            strideButtonStars.Click += delegate
            {
                desiredState = GameState.EndGame;
                var effectOffset = new Vector3(45 - strideButtonStars.RenderSize.X / 2, -5, 0);
                SpawnParticles(strideButtonStars.WorldMatrix.TranslationVector + effectOffset, Prefab, 2f);
            };
            //*********************************

            var bottomBar = CreateBottomBar();

            bottomBar.SetPanelZIndex(1);
            bottomBar.SetGridRow(6);

            var grid = new Grid
            {
                MaximumWidth        = virtualWidth,
                MaximumHeight       = virtualHeight,
                VerticalAlignment   = VerticalAlignment.Center,
                HorizontalAlignment = HorizontalAlignment.Center,
            };

            grid.RowDefinitions.Add(new StripDefinition(StripType.Auto));       // 0
            grid.RowDefinitions.Add(new StripDefinition(StripType.Auto));       // 1
            grid.RowDefinitions.Add(new StripDefinition(StripType.Auto));       // 2
            grid.RowDefinitions.Add(new StripDefinition(StripType.Auto));       // 3
            grid.RowDefinitions.Add(new StripDefinition(StripType.Auto));       // 4
            grid.RowDefinitions.Add(new StripDefinition(StripType.Fixed, 100)); // 5
            grid.RowDefinitions.Add(new StripDefinition(StripType.Fixed, 50));  // 5
            grid.ColumnDefinitions.Add(new StripDefinition());
            grid.LayerDefinitions.Add(new StripDefinition());

            grid.Children.Add(strideSampleTextBlock);
            grid.Children.Add(strideButtonConfetti);
            grid.Children.Add(strideButtonStars);
            grid.Children.Add(bottomBar);

            // Add the background
            var background = new ImageElement {
                Source = SpriteFromSheet.Create(SplashScreenImages, "background_uiimage"), StretchType = StretchType.Fill
            };

            background.SetPanelZIndex(-1);

            Entity.Get <UIComponent>().Page = new UIPage {
                RootElement = new UniformGrid {
                    Children = { background, grid }
                }
            };
        }
Ejemplo n.º 27
0
        protected override async Task LoadContent()
        {
            await base.LoadContent();

            sprites = Content.Load <SpriteSheet>("UIImages");

            // Also draw a texture during the clear renderer
            // TODO: Use a custom compositor as soon as we have visual scripting?
            var topChildRenderer = ((SceneCameraRenderer)SceneSystem.GraphicsCompositor.Game).Child;
            var forwardRenderer  = (topChildRenderer as SceneRendererCollection)?.Children.OfType <ForwardRenderer>().FirstOrDefault() ?? (ForwardRenderer)topChildRenderer;

            forwardRenderer.Clear = new ClearAndDrawTextureRenderer {
                Color = forwardRenderer.Clear.Color, Texture = sprites["GameScreen"].Texture
            };

            var lifeBar = new ImageElement {
                Source = SpriteFromSheet.Create(sprites, "Logo"), HorizontalAlignment = HorizontalAlignment.Center
            };

            lifeBar.DependencyProperties.Set(GridBase.ColumnSpanPropertyKey, 3);

            var quitText = new TextBlock {
                Text = "Quit Game", Font = Content.Load <SpriteFont>("MicrosoftSansSerif15")
            };

            ApplyTextBlockDefaultStyle(quitText);
            var quitGameButton = new Button
            {
                Content             = quitText,
                VerticalAlignment   = VerticalAlignment.Bottom,
                HorizontalAlignment = HorizontalAlignment.Left,
                Padding             = Thickness.UniformRectangle(10),
            };

            ApplyButtonDefaultStyle(quitGameButton);
            quitGameButton.DependencyProperties.Set(GridBase.ColumnPropertyKey, 0);
            quitGameButton.DependencyProperties.Set(GridBase.RowPropertyKey, 2);
            quitGameButton.Click += (sender, args) => Exit();

            modalButton1Text = new TextBlock {
                Text = "Close Modal window 1", Font = Content.Load <SpriteFont>("MicrosoftSansSerif15")
            };
            ApplyTextBlockDefaultStyle(modalButton1Text);
            var modalButton1 = new Button
            {
                Name                = "Button Modal 1",
                Content             = modalButton1Text,
                VerticalAlignment   = VerticalAlignment.Center,
                HorizontalAlignment = HorizontalAlignment.Center,
                Padding             = Thickness.UniformRectangle(10),
            };

            ApplyButtonDefaultStyle(modalButton1);
            modalButton1.Click += ModalButton1OnClick;
            modal1              = new ModalElement {
                Content = modalButton1, Name = "Modal 1"
            };
            modal1.DependencyProperties.Set(Panel.ZIndexPropertyKey, 1);
            modal1.DependencyProperties.Set(GridBase.ColumnPropertyKey, 1);
            modal1.DependencyProperties.Set(GridBase.RowPropertyKey, 1);
            modal1.OutsideClick += Modal1OnOutsideClick;

            modalButton2Text = new TextBlock {
                Text = "Close Modal window 2", Font = Content.Load <SpriteFont>("MicrosoftSansSerif15")
            };
            ApplyTextBlockDefaultStyle(modalButton2Text);
            var modalButton2 = new Button
            {
                Name                = "Button Modal 2",
                Content             = modalButton2Text,
                VerticalAlignment   = VerticalAlignment.Center,
                HorizontalAlignment = HorizontalAlignment.Center,
                Padding             = Thickness.UniformRectangle(10),
            };

            ApplyButtonDefaultStyle(modalButton2);
            modalButton2.Click += ModalButton2OnClick;
            modal2              = new ModalElement {
                Content = modalButton2, Name = "Modal 2"
            };
            modal2.DependencyProperties.Set(Panel.ZIndexPropertyKey, 2);
            modal2.DependencyProperties.Set(GridBase.ColumnPropertyKey, 1);
            modal2.DependencyProperties.Set(GridBase.RowPropertyKey, 2);
            modal2.OutsideClick += Modal2OnOutsideClick;

            uniformGrid = new UniformGrid {
                Columns = 3, Rows = 3
            };
            uniformGrid.Children.Add(modal1);
            uniformGrid.Children.Add(modal2);
            uniformGrid.Children.Add(lifeBar);
            uniformGrid.Children.Add(quitGameButton);

            UIComponent.Page = new Engine.UIPage {
                RootElement = uniformGrid
            };
        }
Ejemplo n.º 28
0
        private UIElement CreateMainSceneShipStatusPanel()
        {
            // Status star bars {Power, Life, Speed}
            var powerStatusDecorator   = CreateMainSceneShipStatusStars("power", powerStatusStar, 0);
            var controlStatusDecorator = CreateMainSceneShipStatusStars("control", controlStatusStar, 1);
            var speedStatusDecorator   = CreateMainSceneShipStatusStars("speed", speedStatusStar, 2);

            PowerStatus   = shipList[activeShipIndex].Power;
            ControlStatus = shipList[activeShipIndex].Control;
            SpeedStatus   = shipList[activeShipIndex].Speed;

            // Put the stats (Stars) in 3x1 uniform grid
            var statusPanel = new UniformGrid {
                Rows = 3
            };

            statusPanel.Children.Add(powerStatusDecorator);
            statusPanel.Children.Add(controlStatusDecorator);
            statusPanel.Children.Add(speedStatusDecorator);
            statusPanel.SetGridColumn(1);

            // SpaceShip Button
            currentShipImage = new ImageElement {
                Source = SpriteFromSheet.Create(MainSceneImages, shipList[activeShipIndex].Name)
            };
            currentShipImage.SetGridRow(1);

            var shipImageSpacerGrid = new Grid {
                HorizontalAlignment = HorizontalAlignment.Center
            };

            shipImageSpacerGrid.Children.Add(currentShipImage);
            shipImageSpacerGrid.RowDefinitions.Add(new StripDefinition(StripType.Star, 2));
            shipImageSpacerGrid.RowDefinitions.Add(new StripDefinition(StripType.Star, 6));
            shipImageSpacerGrid.RowDefinitions.Add(new StripDefinition(StripType.Star, 2));
            shipImageSpacerGrid.ColumnDefinitions.Add(new StripDefinition());
            shipImageSpacerGrid.LayerDefinitions.Add(new StripDefinition());

            var shipButtonDesign  = SpriteFromSheet.Create(MainSceneImages, "display_element");
            var currentShipButton = new Button
            {
                NotPressedImage   = shipButtonDesign,
                PressedImage      = shipButtonDesign,
                MouseOverImage    = shipButtonDesign,
                Content           = shipImageSpacerGrid,
                Padding           = new Thickness(45, 20, 10, 25),
                VerticalAlignment = VerticalAlignment.Center
            };

            currentShipButton.Click += delegate
            {
                // Once click, update the SpaceShip status pop-up and show it.
                UpdateShipStatus();
                ShowShipSelectionPopup();
            };
            currentShipButton.SetGridColumn(3);

            // Status upgrade buttons
            var powerUpgradeButton   = CreateIncreaseStatusButton("P", 0, 0, 2, 0, () => PowerStatus, () => PowerStatus++);
            var controlUpgradeButton = CreateIncreaseStatusButton("C", 0, 1, 2, 0, () => ControlStatus, () => ControlStatus++);
            var speedUpgradeButton   = CreateIncreaseStatusButton("S", 1, 0, 2, 0, () => SpeedStatus, () => SpeedStatus++);
            var lifeUpgradeButton    = CreateIncreaseStatusButton("L", 1, 1, 1, 1, () => 0, () => LifeStatus++);

            // Arrange the status up buttons in a 2x2 Uniform grid.
            var statusUpgradeGridPanel = new UniformGrid
            {
                Rows                = 2,
                Columns             = 2,
                VerticalAlignment   = VerticalAlignment.Center,
                HorizontalAlignment = HorizontalAlignment.Center
            };

            statusUpgradeGridPanel.Children.Add(powerUpgradeButton);
            statusUpgradeGridPanel.Children.Add(controlUpgradeButton);
            statusUpgradeGridPanel.Children.Add(speedUpgradeButton);
            statusUpgradeGridPanel.Children.Add(lifeUpgradeButton);
            statusUpgradeGridPanel.SetGridColumn(5);

            // Put together bottom region in horizontal Stack panel, arranging it from left to right
            var mainPanel = new Grid();

            mainPanel.RowDefinitions.Add(new StripDefinition());
            mainPanel.ColumnDefinitions.Add(new StripDefinition(StripType.Fixed, 10)); // space
            mainPanel.ColumnDefinitions.Add(new StripDefinition(StripType.Star, 4));
            mainPanel.ColumnDefinitions.Add(new StripDefinition(StripType.Fixed, 25)); // space
            mainPanel.ColumnDefinitions.Add(new StripDefinition(StripType.Star, 4));
            mainPanel.ColumnDefinitions.Add(new StripDefinition(StripType.Fixed, 25)); // space
            mainPanel.ColumnDefinitions.Add(new StripDefinition(StripType.Star, 3));
            mainPanel.ColumnDefinitions.Add(new StripDefinition(StripType.Fixed, 10)); // space
            mainPanel.LayerDefinitions.Add(new StripDefinition());

            mainPanel.Children.Add(statusPanel);
            mainPanel.Children.Add(currentShipButton);
            mainPanel.Children.Add(statusUpgradeGridPanel);

            return(mainPanel);
        }
Ejemplo n.º 29
0
        protected override async Task LoadContent()
        {
            await base.LoadContent();

            sprites = Content.Load <SpriteSheet>("UIImages");

            var lifeBar = new ImageElement {
                Source = SpriteFromSheet.Create(sprites, "Logo"), HorizontalAlignment = HorizontalAlignment.Center
            };

            lifeBar.DependencyProperties.Set(GridBase.ColumnSpanPropertyKey, 3);

            var quitGameButton = new Button
            {
                Content = new TextBlock {
                    Text = "Quit Game", Font = Content.Load <SpriteFont>("MicrosoftSansSerif15")
                },
                VerticalAlignment   = VerticalAlignment.Bottom,
                HorizontalAlignment = HorizontalAlignment.Left,
                Padding             = Thickness.UniformRectangle(10),
            };

            quitGameButton.DependencyProperties.Set(GridBase.ColumnPropertyKey, 0);
            quitGameButton.DependencyProperties.Set(GridBase.RowPropertyKey, 2);
            quitGameButton.Click += (sender, args) => Exit();

            modalButton1Text = new TextBlock {
                Text = "Close Modal window 1", Font = Content.Load <SpriteFont>("MicrosoftSansSerif15")
            };
            var modalButton1 = new Button
            {
                Name                = "Button Modal 1",
                Content             = modalButton1Text,
                VerticalAlignment   = VerticalAlignment.Center,
                HorizontalAlignment = HorizontalAlignment.Center,
                Padding             = Thickness.UniformRectangle(10),
            };

            modalButton1.Click += ModalButton1OnClick;
            modal1              = new ModalElement {
                Content = modalButton1, Name = "Modal 1"
            };
            modal1.DependencyProperties.Set(Panel.ZIndexPropertyKey, 1);
            modal1.DependencyProperties.Set(GridBase.ColumnPropertyKey, 1);
            modal1.DependencyProperties.Set(GridBase.RowPropertyKey, 1);
            modal1.OutsideClick += Modal1OnOutsideClick;

            modalButton2Text = new TextBlock {
                Text = "Close Modal window 2", Font = Content.Load <SpriteFont>("MicrosoftSansSerif15")
            };
            var modalButton2 = new Button
            {
                Name                = "Button Modal 2",
                Content             = modalButton2Text,
                VerticalAlignment   = VerticalAlignment.Center,
                HorizontalAlignment = HorizontalAlignment.Center,
                Padding             = Thickness.UniformRectangle(10),
            };

            modalButton2.Click += ModalButton2OnClick;
            modal2              = new ModalElement {
                Content = modalButton2, Name = "Modal 2"
            };
            modal2.DependencyProperties.Set(Panel.ZIndexPropertyKey, 2);
            modal2.DependencyProperties.Set(GridBase.ColumnPropertyKey, 1);
            modal2.DependencyProperties.Set(GridBase.RowPropertyKey, 2);
            modal2.OutsideClick += Modal2OnOutsideClick;

            uniformGrid = new UniformGrid {
                Columns = 3, Rows = 3
            };
            uniformGrid.Children.Add(modal1);
            uniformGrid.Children.Add(modal2);
            uniformGrid.Children.Add(lifeBar);
            uniformGrid.Children.Add(quitGameButton);

            UIComponent.RootElement = uniformGrid;
        }
Ejemplo n.º 30
0
        public override async Task Execute()
        {
            spriteSheet          = SpriteSheet;
            agentSpriteComponent = Entity.Get <SpriteComponent>();

            // Calculate offset of the bullet from the Agent if he is facing left and right side // TODO improve this
            var bulletOffset = new Vector3(1f, 0.2f, 0f);

            // Initialize game entities
            if (!IsLiveReloading)
            {
                shootDelayCounter     = 0f;
                isAgentFacingRight    = true;
                currentAgentAnimation = AgentAnimation.Idle;
            }
            CurrentAgentAnimation = currentAgentAnimation;

            while (Game.IsRunning)
            {
                await Script.NextFrame();

                var inputState = GetKeyboardInputState();

                if (inputState == InputState.None)
                {
                    inputState = GetPointerInputState();
                }

                // Reset the shoot delay, if state changes
                if (inputState != InputState.Shoot && CurrentAgentAnimation == AgentAnimation.Shoot)
                {
                    shootDelayCounter = 0;
                }

                if (inputState == InputState.RunLeft || inputState == InputState.RunRight)
                {
                    // Update Agent's position
                    var dt = (float)Game.UpdateTime.Elapsed.TotalSeconds;

                    Entity.Transform.Position.X += ((inputState == InputState.RunRight) ? AgentMoveDistance : -AgentMoveDistance) * dt;

                    if (Entity.Transform.Position.X < -gameWidthHalfX)
                    {
                        Entity.Transform.Position.X = -gameWidthHalfX;
                    }

                    if (Entity.Transform.Position.X > gameWidthHalfX)
                    {
                        Entity.Transform.Position.X = gameWidthHalfX;
                    }

                    isAgentFacingRight = inputState == InputState.RunRight;

                    // If agent face left, flip the sprite
                    Entity.Transform.Scale.X = isAgentFacingRight ? 1f : -1f;

                    // Update the sprite animation and state
                    CurrentAgentAnimation = AgentAnimation.Run;
                }
                else if (inputState == InputState.Shoot)
                {
                    // Update shootDelayCounter, and check whether it is time to create a new bullet
                    shootDelayCounter -= (float)Game.UpdateTime.Elapsed.TotalSeconds;

                    if (shootDelayCounter > 0)
                    {
                        continue;
                    }


                    // Reset shoot delay
                    shootDelayCounter = AgentShootDelay;

                    // Spawns a new bullet
                    var bullet = new Entity
                    {
                        new SpriteComponent {
                            SpriteProvider = SpriteFromSheet.Create(spriteSheet, "bullet")
                        },

                        // Will make the beam move along a direction at each frame
                        new BeamScript {
                            DirectionX = isAgentFacingRight ? 1f : -1f, SpriteSheet = SpriteSheet
                        },
                    };

                    bullet.Transform.Position = (isAgentFacingRight) ? Entity.Transform.Position + bulletOffset : Entity.Transform.Position + (bulletOffset * new Vector3(-1, 1, 1));

                    SceneSystem.SceneInstance.Scene.Entities.Add(bullet);
                    Logic.WatchBullet(bullet);

                    // Start animation for shooting
                    CurrentAgentAnimation = AgentAnimation.Shoot;
                }
                else
                {
                    CurrentAgentAnimation = AgentAnimation.Idle;
                }
            }
        }