/// <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; } }
/// <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(); } }
/// <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; }