Пример #1
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            {
                Exit();
            }

            KeyboardState state = Keyboard.GetState();

            if (currentState == GameState.Playing || currentState == GameState.Victory)
            {
                // Moving Logic

                if (state.IsKeyDown(Keys.A))
                {
                    player.Position.X -= 7;
                }

                if (state.IsKeyDown(Keys.D))
                {
                    player.Position.X += 7;
                }

                // Collision Logic
                if (player.Position.X >= GraphicsDevice.Viewport.Width - player.GetWidth())
                {
                    player.Position.X = GraphicsDevice.Viewport.Width - player.GetWidth();
                }
                else if (player.Position.X <= 0)
                {
                    player.Position.X = 0;
                }



                // Shooting

                if (state.IsKeyDown(Keys.Space) && cooldown >= 30)
                {
                    Texture2D bullet = Content.Load <Texture2D>("blast_shot_blue");
                    playerBullets.Add(
                        new Bullet(bullet,
                                   new Vector2(player.Position.X + player.GetWidth() / 2 - bullet.Width / 2, player.Position.Y),
                                   player,
                                   new Vector2(0, -8)
                                   ));
                    cooldown = 0;
                }

                // Player Bullets Logic

                for (int i = 0; i < playerBullets.Count; i++)
                {
                    Bullet bullet = playerBullets[i];
                    bullet.Move();
                    bullet.UpdateLogic();
                    if (bullet.Position.Y <= 0 - bullet.GetHeight() || bullet.Position.Y >= GraphicsDevice.Viewport.Height)
                    {
                        playerBullets.Remove(bullet);
                    }

                    foreach (List <Invader> invadersList in invaders)
                    {
                        foreach (Invader invader in invadersList)
                        {
                            invader.UpdateLogic();
                            if (bullet.Intersects(invader.Box) && invader.IsShot == false)
                            {
                                invader.IsShot = true;
                                bullet.isUsed  = true;
                                break;
                            }
                        }
                    }

                    for (int a = 0; a < invaders.Count; a++)
                    {
                        List <Invader> invadersList = invaders[a];
                        for (int b = 0; b < invadersList.Count; b++)
                        {
                            if (invadersList[b].IsShot)
                            {
                                invadersList.Remove(invadersList[b]);
                            }
                        }
                    }

                    if (bullet.isUsed)
                    {
                        playerBullets.Remove(bullet);
                    }
                }



                // Invaders moving
                foreach (List <Invader> invadersList in invaders)
                {
                    foreach (Invader invader in invadersList)
                    {
                        invader.Move();
                        if (invader.Position.X >= GraphicsDevice.Viewport.Width - invader.GetWidth())
                        {
                            invader.Position.X = GraphicsDevice.Viewport.Width - invader.GetWidth();
                            invader.ChangeVelocityXSign();
                        }
                        if (invader.Position.X <= 0)
                        {
                            invader.Position.X = 0;
                            invader.ChangeVelocityXSign();
                        }

                        invader.UpdateLogic();
                    }
                }

                // Invaders Shooting
                Random random = new Random();
                foreach (List <Invader> invadersList in invaders)
                {
                    foreach (Invader invader in invadersList)
                    {
                        if (invader.Position.Y >= 0 - invader.GetHeight() && invader.Cooldown >= invader.MaxCooldown)
                        {
                            Texture2D bullet = Content.Load <Texture2D>("blast_shot_red");
                            invaderBullets.Add(
                                new Bullet(bullet,
                                           new Vector2(invader.Position.X + invader.GetWidth() / 2 - bullet.Width / 2, invader.Position.Y + invader.GetHeight()),
                                           invader,
                                           new Vector2(0, 8)
                                           ));
                            invader.ResetCooldown();
                        }
                        else if (invader.Position.Y >= 0 - invader.GetHeight())
                        {
                            invader.IncreaseCooldown();
                        }
                    }
                }

                // Invaders Bullets Logic
                for (int i = 0; i < invaderBullets.Count; i++)
                {
                    Bullet bullet = invaderBullets[i];
                    bullet.Move();
                    bullet.UpdateLogic();

                    if (bullet.Position.Y <= 0 - bullet.GetHeight() || bullet.Position.Y >= GraphicsDevice.Viewport.Height)
                    {
                        invaderBullets.Remove(bullet);
                    }

                    if (player.IntersectsCut(bullet.Box, 30))
                    {
                        bullet.isUsed = true;
                        currentState  = GameState.GameOver;
                    }

                    if (bullet.isUsed)
                    {
                        invaderBullets.Remove(bullet);
                    }
                }

                // Check if row is empty
                for (int a = 0; a < invaders.Count; a++)
                {
                    if (invaders[a].Count == 0)
                    {
                        invaders.Remove(invaders[a]);
                    }
                }

                // Victory Conditions
                if (invaders.Count == 0)
                {
                    currentState = GameState.Victory;
                }

                player.UpdateLogic();
                invaderCooldown += 1;
                cooldown        += 1;
            }

            // Fullscreen on or off
            if (state.IsKeyDown(Keys.F))
            {
                if (graphics.IsFullScreen == true)
                {
                    graphics.IsFullScreen = false;
                }
                else if (graphics.IsFullScreen == false)
                {
                    graphics.IsFullScreen = true;
                }
                graphics.ApplyChanges();
            }

            // Runs this if it is game over.
            if (currentState == GameState.GameOver || currentState == GameState.Victory)
            {
                if (state.IsKeyDown(Keys.R))
                {
                    currentState = GameState.Restarting;
                }
            }

            // Runs when restarting
            if (currentState == GameState.Restarting)
            {
                if (restartingCounter == 0)
                {
                    restartingCounter = 180;
                    currentState      = GameState.Playing;
                }

                if (restartingCounter == 180)
                {
                    Texture2D ship    = Content.Load <Texture2D>("ship_2");
                    Texture2D invader = Content.Load <Texture2D>("invader_1");
                    player = new Player(ship, new Vector2(GraphicsDevice.Viewport.Width / 2 - (ship.Width / 2) * scale, GraphicsDevice.Viewport.Height - ship.Height * scale));
                    player.SetScale(scale);
                    int invaderCount = 8;
                    int rows         = 4;
                    invaders       = new List <List <Invader> >();
                    playerBullets  = new List <Bullet>();
                    invaderBullets = new List <Bullet>();
                    Random random = new Random();
                    for (int a = 0; a < rows; a++)
                    {
                        invaders.Add(new List <Invader>());
                        for (int i = 0; i < invaderCount; i++)
                        {
                            invaders[a].Add(new Invader(
                                                invader,
                                                new Vector2(((GraphicsDevice.Viewport.Width / invaderCount) * i), 10 - (invader.Height + 20) * a),
                                                new Vector2(4, 0.25f),
                                                random.Next(160, 300)
                                                ));
                        }
                    }
                }



                restartingCounter -= 1;
            }

            base.Update(gameTime);
        }