/// <summary> /// Создание набора элементов, которые мы хотим отрисовать /// </summary> public static void Load() { _objs = new BaseObject[30]; for (var i = 0; i < _objs.Length - 1; i++) { int r = rnd.Next(5, 50); _objs[i] = new Star(new Point(1000, rnd.Next(0, Game.Height)), new Point(-r, r), new Size(3, 3)); } _objs[_objs.Length - 1] = new ImageObject(new Point(rnd.Next(0, Width), rnd.Next(0, Height)), new Point(-_objs.Length + 10, _objs.Length - 10), new Size(30, 30), Image.FromFile(@"img\comet.png")); _asteroids = NewAsteroids(difficulty); _medkit = NewMedkit(); ////Мы решили создать 30 объектов на экране //_objs = new BaseObject[30]; //Random rnd = new Random(); //// Кометы - одна пятая всех объектов //for (int i = 0; i < _objs.Length / 5; i++) // _objs[i] = new ImageObject(new Point(600, i * 60), new Point(-i - 1, i + 1), // new Size(30, 30), Image.FromFile(@"img\comet.png")); //// Обычные звезды - одна пятая всех объектов //for (int i = _objs.Length / 5; i < _objs.Length / 5 * 2; i++) // _objs[i] = new Star(new Point(400, i * 90 - 550), new Point(-i, 0), new Size(5, 5)); //// Круглые звезды - одна пятая всех объектов //for (int i = _objs.Length / 5 * 2; i < _objs.Length / 5 * 3; i++) // _objs[i] = new StationaryCircle(new Point(rnd.Next(0, Width), rnd.Next(0, Height)), // new Point(-i, 0), new Size(13, 13), Brushes.Yellow); //// Насыщенные голубые звезды - две пятых всех объектов //for (int i = _objs.Length / 5 * 3; i < _objs.Length; i++) // _objs[i] = new ThickStar(new Point(200, i * 50 - 970), new Point(-i, 0), // new Size(9, 9), Pens.Aquamarine); }
/// <summary> /// Перевод всех объектов игры к следующему положению и состоянию, в соответсвии с их внутренней логикой /// Проверка на попадание объектов в друг-друга /// </summary> public static void Update() { foreach (BaseObject obj in _objs) { obj.Update(); } for (int i = 0; i < _bullets.Count; i++) { if (_bullets[i].OutOfZone(Width, Height)) { _bullets.RemoveAt(i); i--; } } foreach (Bullet b in _bullets) { b.Update(); } _medkit?.Update(); if (_ship.Collision(_medkit)) { log?.Invoke($"Найдена аптечка. Энергия корабля будет восстановлена на {_medkit.Power} единиц"); _ship.Heal(_medkit.Power); _medkit = NewMedkit(); } 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 (_asteroids[i] != null && _bullets[j].Collision(_asteroids[i])) { System.Media.SystemSounds.Hand.Play(); log?.Invoke($"Пуля попала в астероид, астероид уничтожен, вы заработали {_asteroids[i].Power} очков"); score += _asteroids[i].Power; _asteroids[i] = null; _bullets.RemoveAt(j); j--; } } if (_asteroids[i] == null || !_ship.Collision(_asteroids[i])) { continue; } _ship.EnergyLow(_asteroids[i].Power); System.Media.SystemSounds.Asterisk.Play(); log?.Invoke($"Корабль столкнулся с Астероидом и получил {_asteroids[i].Power} урона."); if (_ship.Energy <= 0) { _ship?.Die(); log?.Invoke($"Корабль уничтожен, конец игры. Уровень: {level}, суммарно очков набрано: {score}"); // Вероятно тут нужно будет добавить конец игры timer.Stop(); DrawEndOfGame(); } } _asteroids.RemoveAll(a => a == null); if (_asteroids.Count == 0) { _asteroids = NewAsteroids(++difficulty); level++; } }