Пример #1
0
        /// <summary>
        /// Метод перемещения объекта.
        /// </summary>
        private void SetDirection()
        {
            if (KeysHandler.IsPressed(Keys.W) || KeysHandler.IsPressed(Keys.Up))
            {
                Dir.Y = -MaxDir.Y;
            }
            else if (KeysHandler.IsPressed(Keys.S) || KeysHandler.IsPressed(Keys.Down))
            {
                Dir.Y = MaxDir.Y;
            }
            else
            {
                Dir.Y = 0;
            }

            if (KeysHandler.IsPressed(Keys.A) || KeysHandler.IsPressed(Keys.Left))
            {
                Dir.X = -MaxDir.X;
            }
            else if (KeysHandler.IsPressed(Keys.D) || KeysHandler.IsPressed(Keys.Right))
            {
                Dir.X = MaxDir.X;
            }
            else
            {
                Dir.X = 0;
            }
        }
Пример #2
0
        /// <summary>
        /// Метод изменения состояния объекта Ship.
        /// </summary>
        public override void Update()
        {
            // Обновляем пул снарядов.
            BulletPool.Update();

            // Устанавливаем направление объекта.
            SetDirection();

            // Перемещаем объект.
            Pos.X += Dir.X * Game.DeltaTime;
            Pos.Y += Dir.Y * Game.DeltaTime;

            // Если объект вышел за границу, то возвращаем обратно.
            if (Pos.X < -Size.Width * 0.3)
            {
                Pos.X = (int)(-Size.Width * 0.3);
            }
            if (Pos.X > Game.Width - Size.Width)
            {
                Pos.X = Game.Width - Size.Width;
            }
            if (Pos.Y < 0)
            {
                Pos.Y = 0;
            }
            if (Pos.Y > Game.Height - Size.Height)
            {
                Pos.Y = Game.Height - Size.Height;
            }

            if (KeysHandler.IsPressed(Keys.Space))
            {
                Shoot();
            }
        }
Пример #3
0
        /// <summary>
        /// Обновление объектов.
        /// </summary>
        private static void Update()
        {
            // Время расчета между двумя кадрами.
            DeltaTime = (float)(DateTime.Now - _lastUpdate).TotalMilliseconds / 1000;

            foreach (var obj in _objs)
            {
                obj.Update();
            }

            // Выключаем обучение или перезапускаем игру.
            if (KeysHandler.IsPressed(Keys.Enter))
            {
                Tutorial = false;

                #region Перезапуск игры.

                if (!Ship.Active)
                {
                    foreach (var asteroid in Asteroids)
                    {
                        asteroid.Active = false;
                    }

                    Repair.Active = false;
                    Ship.Active   = true;

                    Score = 0;
                    Level = 0;
                }

                #endregion
            }

            // При обучении отключаем астероиды и рем. комплекты.
            if (!Tutorial)
            {
                // Проверяем, нужно ли включить астероиды.
                if (Asteroids.Count(a => a.Active) == 0)
                {
                    if (WaitNextLevel)
                    {
                        WaitNextLevel = (DateTime.Now - _loadStartedTime).TotalSeconds <= BetweenLevelDelay;

                        if (!WaitNextLevel)
                        {
                            ActivateAsteroid();
                        }
                    }
                    else
                    {
                        Level++;
                        LoadLevel();
                    }
                }

                // Обновляем рем. комплект.
                // Если астероидов менее 5, то рем. комплект не активируем.
                if (!WaitNextLevel && Asteroids.Count(a => a.Active) > 5)
                {
                    Repair.Active = true;
                }
                if (Repair.Active)
                {
                    Repair.Update();
                }

                // Проверяем столкновение рем. комплекта и коробля.
                if (Ship.Active && Repair.Active && Ship.Collision(Repair))
                {
                    Ship.ChangeEnergy(5);
                    Repair.Active = false;
                    RepairSound.Play();

                    Log.WriteLine("Ship is repaid.");
                }

                // Обновляем активные астероиды.
                foreach (var asteroid in Asteroids.Where(a => a.Active))
                {
                    asteroid.Update();

                    if (!Ship.Active || !Ship.Collision(asteroid))
                    {
                        continue;
                    }

                    asteroid.Active = false;

                    // Получаем урон в зависимости от размера астероида.
                    Ship.ChangeEnergy(-10 * asteroid.Size.Width / asteroid.MaxSize.Width);

                    Log.WriteLine("Ship is hit by asteroid.");

                    if (Ship.Energy == 0)
                    {
                        Ship.Active = false;
                        GameOverSound.Play();

                        Log.WriteLine("Ship is destroyed.");
                        break;
                    }

                    HitSound.Play();
                }
            }

            if (Ship.Active)
            {
                Ship.Update();
            }
            UI.Draw();

            _lastUpdate = DateTime.Now;
        }