/// <summary> /// Метод инициализации игровых объектов /// </summary> public static void Load() { //Создаем массив движущихся объектов objs = new BaseObject[30]; for (int i = 0; i < objs.Length; i++) { if (i < objs.Length - 4) { //добавление объектов класса Star objs[i] = new Star(new Point(rnd.Next(0, Width), rnd.Next(0, Height)), new Point(-rnd.Next(1, i + 1), 0), new Size(5, 5)); } else { //добавление объектов класса Planet if (Math.Abs(i - objs.Length) == 4) { objs[i] = new Earth(new Point(rnd.Next(0, Width), rnd.Next(100, Height - 100)), new Point(-rnd.Next(1, 10), rnd.Next(1, 10)), Planet.PlanetsEnum.Earth); } if (Math.Abs(i - objs.Length) == 3) { objs[i] = new Anoa(new Point(rnd.Next(0, Width), rnd.Next(100, Height - 100)), new Point(-rnd.Next(1, 10), rnd.Next(1, 10)), Planet.PlanetsEnum.Anoa); } if (Math.Abs(i - objs.Length) == 2) { objs[i] = new Saturn(new Point(rnd.Next(0, Width), rnd.Next(100, Height - 100)), new Point(-rnd.Next(1, 10), rnd.Next(1, 10)), Planet.PlanetsEnum.Saturn); } if (Math.Abs(i - objs.Length) == 1) { objs[i] = new Venus(new Point(rnd.Next(0, Width), rnd.Next(100, Height - 100)), new Point(-rnd.Next(1, 10), rnd.Next(1, 10)), Planet.PlanetsEnum.Venus); } } } //добавление объектов класса Asteroid AsteroidsGenerate(asteroidsCounter); //добавляем корабль ship = new SpaceShip(new Point(0, Height / 2), new Point(5, 5), new Size(30, 30)); //добавляем аптечку medicalKit = new MedicalKit(new Point(Width, rnd.Next(10, Height - 10)), new Point(10, 0), new Size(20, 20)); ActionMessage = GameStart; }
/// <summary> /// Обработка игрового таймера /// </summary> /// <param name="sender">Источник события</param> /// <param name="e">Уведомление</param> private static void Timer_Tick(object sender, EventArgs e) { Draw(); Update(); ActionMessage = null; }
/// <summary> /// Метод обновления состояния игровых объектов с проверкой игровых событий /// </summary> public static void Update() { //обновление состояния фона foreach (BaseObject obj in objs) { obj.Update(); } //обновление состояния снарядов foreach (var bullet in bullets) { bullet?.Update(); } //обновление состояния аптечки if (medicalFlag) { medicalKit.Update(); } //проверка состояния аптечки if (ship.Collision(medicalKit) || medicalKit.Position.X < 0) { if (ship.Collision(medicalKit)) { ship.IncreaseEnergy(10); } medicalFlag = false; medicalKit.Regenerate(); medicalTimer.Stop(); medicalTimer.Start(); ActionMessage = TakenMedicalKid; } //проверка состояния астероидов for (var i = 0; i < asteroids.Count; i++) { if (asteroids[i] == null) { continue; } asteroids[i].Update(); for (int j = 0; j < bullets.Count; j++) { if (bullets[j] != null && bullets[j].Collision(asteroids[i])) { System.Media.SystemSounds.Hand.Play(); ActionMessage = AsteroidCollapse; asteroids[i] = null; bullets[j] = null; ship.HitTarget(); break; } if (bullets[j]?.Position.X > Game.Width) { bullets[j] = null; } } if (asteroids[i] == null) { continue; } if (!ship.Collision(asteroids[i])) { continue; } ship?.ReductionOfEnergy(10); ActionMessage = AsteroidCollision; asteroids[i] = null; System.Media.SystemSounds.Asterisk.Play(); //проверка состояния корабля if (ship.Energy <= 0) { ship?.Die(); ActionMessage = GameEnd; } } //проверка сбиты ли все астероиды if (ListEmpty(asteroids)) { asteroidsCounter++; AsteroidsGenerate(asteroidsCounter); } ActionMessage?.Invoke(); }