public static void Update() { foreach (var game_object in __GameObjects) { game_object?.Update(); } var asteroid_to_remove = new List <Asteroid>(); __Asteroids.ForEach(a => a.Update()); __Bullets.ForEach(b => b.Update()); foreach (var bullet_to_remove in __Bullets.Where(b => b.Rect.Left > Width).ToArray()) { __Bullets.Remove(bullet_to_remove); } for (var i = 0; i < __Asteroids.Count; i++) { __Asteroids[i].Update(); __SpaceShip.CheckCollision(__Asteroids[i]); foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(__Asteroids[i])) { Score++; __Bullets.Remove(bullet); __Asteroids.Remove(__Asteroids[i]); System.Media.SystemSounds.Beep.Play(); __Logger("Астероид уничтожен"); } if (__Asteroids.Count == 0) { __Asteroids = Asteroid.NewAsteroidCollection(new Random(), Game.Width, Game.Height, asteroid_max_speed, asteroid_count + 1, asteroid_size); } } } for (var i = 0; i < __GameObjects.Length; i++) { var obj = __GameObjects[i]; if (obj is ICollision) { var collision_object = (ICollision)obj; __SpaceShip.CheckCollision(collision_object); } } }
/// <summary>Обновление состояния объектов сцены</summary> public static void Update() { foreach (var visual_object in __GameObjects) { visual_object?.Update(); } __Bullet?.Update(); for (var i = 0; i < __GameObjects.Length; i++) { var obj = __GameObjects[i]; if (obj is ICollision) // Применить "сопоставление с образцом"! { var collision_object = (ICollision)obj; __Ship.CheckCollision(collision_object); if (__Bullet != null && __Bullet.CheckCollision(collision_object)) { __Bullet = null; //__Bullet = new Bullet(new Random().Next(Width)); __GameObjects[i] = null; MessageBox.Show("Астероид уничтожен!", "Столкновение", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }
public static void Update() { if (__CtrlKeyPressed > 0) { for (var i = 0; i < __CtrlKeyPressed; i++) { __Bullets.Add(new Bullet(__Ship.Position.Y)); } } foreach (var visual_object in __GameObjects) { visual_object?.Update(); } foreach (var visual_object in __StarObjects) { visual_object?.Update(); } __Bullet?.Update(); //if (__Bullet.Position.X > Width) // __Bullet = new Bullet(new Random().Next(Width)); //foreach (var visual_object in __GameObjectsSmall) // visual_object.Update(); for (var i = 0; i < __StarObjects.Length; i++) { var obj = __StarObjects[i]; if (obj is ICollision) { var collision_object = (ICollision)obj; __Ship.CheckCollision(collision_object); if (__Bullet != null && __Bullet.CheckCollision(collision_object)) { count_Stars++; __Bullet = null; //__Bullet = new Bullet(new Random().Next(Width)); __StarObjects[i] = null; MessageBox.Show("Объект уничтожен!", "Столкновение", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } if (__StarObjects.Length == 0) { Console.Clear(); } }
public static void Update() { foreach (var game_object in __GameObjects) { game_object?.Update(); } //__Bullet?.Update(); __Bullets.ForEach(b => b.Update()); foreach (var bullet_to_remove in __Bullets.Where(b => b.Rect.Left > Width).ToArray()) { __Bullets.Remove(bullet_to_remove); } for (var i = 0; i < __GameObjects.Length; i++) { var obj = __GameObjects[i]; if (obj is ICollision) { var collision_object = (ICollision)obj; __SpaceShip.CheckCollision(collision_object); foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(collision_object)) { //__Bullet = null; __Bullets.Remove(bullet); __GameObjects[i] = null; System.Media.SystemSounds.Beep.Play(); } } } } }
public static void Update() { foreach (var visual_object in __GameObjects) { visual_object?.Update(); } //__Bullet?.Update(); var bullets_to_remove = new List <Bullet>(); foreach (var bullet in __Bullets) { bullet.Update(); if (bullet.Position.X > Width) { bullets_to_remove.Add(bullet); } } var rnd = new Random(); for (var i = 0; i < __GameObjects.Length; i++) { var obj = __GameObjects[i]; if (obj is ICollision) { var collision_object = (ICollision)obj; __Ship.CheckCollision(collision_object); foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(collision_object)) { bullets_to_remove.Add(bullet); if (__GameObjects[i] is Asteroid) { __Ship.Score++; number_of_asteroids--; Console.WriteLine("A: {0}", number_of_asteroids); } else { // medkit __Ship.Score--; current_medkit_count--; } __GameObjects[i] = null; } } //if (__Bullets.Any(b => b.CheckCollision(collision_object))) { //} //foreach (var bullet in __Bullets.Where(b => b.CheckCollision(collision_object))) //{ // __Bullets.Remove(bullet); //} //MessageBox.Show("Astroid has been destroyed.", "Collision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } foreach (var bullet in bullets_to_remove) { __Bullets.Remove(bullet); } if (number_of_asteroids == 0) { List <VisualObject> game_object = new List <VisualObject>(); Console.WriteLine("N:{0} A:{1} M:{2}", number_of_asteroids, current_asteroids_count, current_medkit_count); current_asteroids_count++; number_of_asteroids = current_asteroids_count; Console.WriteLine("N:{0} A:{1} M:{2}", number_of_asteroids, current_asteroids_count, current_medkit_count); game_object.AddRange(CreateAsteroids(current_asteroids_count)); if (current_medkit_count > 0) { game_object.AddRange(CreateMedKit(current_medkit_count)); } else { game_object.AddRange(CreateMedKit(Math.Abs(current_asteroids_count / 3))); } __GameObjects = null; __GameObjects = game_object.ToArray(); } }
public static void Update() { foreach (var visual_object in __GameObjects) { visual_object?.Update(); } foreach (var asteroid in __Asteroids) { asteroid?.Update(); } var bullets_to_remove = new List <Bullet>(); foreach (var bullet in __Bullets) { bullet.Update(); if (bullet.Position.X > Width) { bullets_to_remove.Add(bullet); } } var asteroids_to_remove = new List <Asteroid>(); for (var i = 0; i < __Asteroids.Count; i++) { var obj = __Asteroids[i]; if (obj is ICollision) // Применить "сопоставление с образцом"! { var collision_object = (ICollision)obj; __SpaceShip.CheckCollision(collision_object); foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(collision_object)) { bullets_to_remove.Add(bullet); asteroids_to_remove.Add(__Asteroids[i]); GamePoints++; } } } } foreach (var bullet in bullets_to_remove) { __Bullets.Remove(bullet); } foreach (var asteroid in asteroids_to_remove) { __Asteroids.Remove(asteroid); } if (__Asteroids.Count == 0) { asteroids_count++; var rnd = new Random(); for (var j = 0; j < asteroids_count; j++) { __Asteroids.Add(new Asteroid( new Point(rnd.Next(0, Width), rnd.Next(0, Height)), new Point(-rnd.Next(0, asteroid_max_speed), 0), asteroid_size)); } } }
public static void Update() { if (__CtrlKeyPressed > 0) { for (int i = 0; i < __CtrlKeyPressed; i++) { __Bullets.Add(new Bullet(__SpaceShip.Rect.Y)); } __CtrlKeyPressed = 0; } if (__UpKeyPressed > 0) { for (int i = 0; i < __UpKeyPressed; i++) { __SpaceShip.MoveUp(); } __UpKeyPressed = 0; } if (__DownKeyPressed > 0) { for (int i = 0; i < __DownKeyPressed; i++) { __SpaceShip.MoveDown(); } __DownKeyPressed = 0; } foreach (var game_object in __GameObjects) { game_object?.Update(); } __Bullets.ForEach(b => b.Update()); foreach (var bullet_to_remove in __Bullets.Where(b => b.Rect.Left > Width).ToArray()) { __Bullets.Remove(bullet_to_remove); } for (int i = 0; i < __GameObjects.Length; i++) { var obj = __GameObjects[i]; if (obj is ICollision) { var collision_object = (ICollision)obj; __SpaceShip.CheckCollision(collision_object); foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(collision_object)) { __Bullets.Remove(bullet); __GameObjects[i] = null; System.Media.SystemSounds.Asterisk.Play();//TODO заменить звук Log?.Invoke("Астероид уничтожен"); } } } } }
public static void Update() { //рисуем звезды foreach (var visual_object in __GameObjects) { visual_object?.Update(); } //массивы на удаление var asteroid_to_remove = new List <Asteroid>(); var bullets_to_remove = new List <Bullet>(); var aptekas_to_remove = new List <Apteka>(); //рисуем и обрабатываем столкновения с пулями foreach (var bullet in __Bullets) { bullet?.Update(); if (bullet.Position.X > Game.Width) { bullets_to_remove.Add(bullet); } } //если поизошло столкновение астероида с кораблем - удаляем астероид for (var i = 0; i < __Asteroids.Count; i++) { __Asteroids[i].Update(); //проверка столкновения с астероидом __Ship.CheckCollision(__Asteroids[i]); if (__Asteroids[i].CheckCollision(__Ship)) { asteroid_to_remove.Add(__Asteroids[i]); Score++; __Logger($"Астероид уничтожен"); } foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(__Asteroids[i])) { bullets_to_remove.Add(bullet); asteroid_to_remove.Add(__Asteroids[i]); Score++; __Logger($"Астероид уничтожен"); } } } //обработка столкновения с аптечкой foreach (var apteka in __Aptekas) { apteka.Update(); if (__Ship.CheckCollision(apteka)) { aptekas_to_remove.Add(apteka); } } //удаление ненужных объектов foreach (var asteriod in asteroid_to_remove) { __Asteroids.Remove(asteriod); } //если астероиды закончились до добавляем еще, на один больше if (__Asteroids.Count == 0) { __Asteroids = Asteroid.NewAsteroidCollection(new Random(), Game.Width, Game.Height, asteroid_max_speed, asteroid_count + 1, asteroid_max_size); } foreach (var bullet in bullets_to_remove) { __Bullets.Remove(bullet); } }
/// <summary> Task 3 Lesson 2 /// Сделать так, чтобы при столкновениях пули с астероидом /// они регенерировались в разных концах экрана. /// </summary> public static void Update() { #region old code //foreach (var game_object in __GameObjects) // game_object.Update(); //__Bullet?.Update(); //__PowerAid.Update(); ////if (__Bullet is null || __Bullet.Rect.Left > Width) ////if (__Bullet.Rect.Left > Width) ////{ //// var rnd = new Random(); //// __Bullet = new Bullet(rnd.Next(0, Height)); ////} //for (var i = 0; i < __GameObjects.Length; i++) //{ // var obj = __GameObjects[i]; // if (obj is ICollision) // { // var collision_object = (ICollision)obj; // if (__SpaceShip.CheckCollision(collision_object)) // { // __GameLog.LogEnergyDown(_Counter); // __GameLogFile.LogEnergyDown(_Counter); // __GameLog.Flush(); // __GameLogFile.Flush(); // } // if (__PowerAid.CheckCollision(collision_object)) // { // __GameLog.LogEnergyUp(_Counter); // __GameLogFile.LogEnergyUp(_Counter); // __GameLog.Flush(); // __GameLogFile.Flush(); // var rnd = new Random(); // __PowerAid = new PowerAid( // new Point(rnd.Next(0, Width), rnd.Next(0, Height)), // new Point(-rnd.Next(0, _ObjectMaxSpeed), 10), // _ObjectSize); // } // if (__Bullet != null) // { // if (__Bullet.CheckCollision(collision_object)) // { // _Counter++; // __GameLog.LogAsteroidShotDown(_Counter); // __GameLogFile.LogAsteroidShotDown(_Counter); // __GameLog.Flush(); // __GameLogFile.Flush(); // __GameObjects[i] = null; // __Bullet = null; // var rnd = new Random(); // ////__Bullet = new Bullet(rnd.Next(0, Height)); // ////const int asteroid_size = 40; // ////const int asteroid_max_speed = 20; // __GameObjects[i] = new Asteroid( // // поскольку пуля всегда летит слева на право, астероид будет перенесен вправо. // new Point(rnd.Next(Width - 50, Width), rnd.Next(0, Height)), // new Point(-rnd.Next(0, _ObjectMaxSpeed), 0), // _ObjectSize + 15);//будет отличаться размером // System.Media.SystemSounds.Beep.Play(); // } // } // } //} #endregion __SpaceShip?.Update(); __Bullets?.ForEach(bullet => bullet.Update()); __PowerAids?.ForEach(poweraid => poweraid.Update()); __Asteroids?.ForEach(asteroid => asteroid.Update()); __Stars?.ForEach(star => star.Update()); foreach (var bullet_to_remove in __Bullets.Where(b => b.Rect.Left > Width).ToArray()) { __Bullets.Remove(bullet_to_remove); } for (int i = 0; i < __Asteroids.Count; i++) { var obj = __Asteroids[i]; if (obj is ICollision) { var collision_object = (ICollision)obj; if (__SpaceShip.CheckCollision(collision_object)) { __GameLog.LogEnergyDown(_Counter); __GameLogFile.LogEnergyDown(_Counter); __GameLog.Flush(); __GameLogFile.Flush(); if (i < __Asteroids.Count) { __Asteroids.Remove(__Asteroids[i]); } } foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(collision_object)) { _Counter++; __Bullets.Remove(bullet); if (i < __Asteroids.Count) { __Asteroids.Remove(__Asteroids[i]); } System.Media.SystemSounds.Beep.Play(); __GameLog.LogAsteroidShotDown(_Counter); __GameLogFile.LogAsteroidShotDown(_Counter); __GameLog.Flush(); __GameLogFile.Flush(); } } } } for (int i = 0; i < __PowerAids.Count; i++) { var obj = __PowerAids[i]; if (obj is ICollision) { var collision_object = (ICollision)obj; if (__SpaceShip.CheckCollision(collision_object)) { __GameLog.LogEnergyUp(_Counter); __GameLogFile.LogEnergyUp(_Counter); __GameLog.Flush(); __GameLogFile.Flush(); __PowerAids.Remove(__PowerAids[i]); System.Media.SystemSounds.Beep.Play(); __PowerAids.Add(new PowerAid( new Point(_Random.Next(0, Width), _Random.Next(0, Height - _ObjectSize)), new Point(-_Random.Next(1, _ObjectMaxSpeed), 10), _ObjectSize)); System.Media.SystemSounds.Beep.Play(); } } } if (__Asteroids.Count == 0) { _AsteroidCount++; for (int a = 0; a < _AsteroidCount; a++) { __Asteroids.Add(new Asteroid( new Point(_Random.Next(Width - 70, Width), _Random.Next(0, Height - _ObjectSize)), new Point(-_Random.Next(1, _ObjectMaxSpeed), 0), _Random.Next(_ObjectSize - 5, _ObjectSize + 10))); } } }
/// <summary>Обновление состояния объектов сцены</summary> public static void Update() { if (__CtrlKeyPressed > 0) { for (var i = 0; i < __CtrlKeyPressed; i++) { __Bullets.Add(new Bullet(__Ship.Position.Y)); } __CtrlKeyPressed = 0; } if (__UpKeyPressed > 0) { for (var i = 0; i < __UpKeyPressed; i++) { __Ship.MoveUp(); } __UpKeyPressed = 0; } if (__DownKeyPressed > 0) { for (var i = 0; i < __DownKeyPressed; i++) { __Ship.MoveDown(); } __DownKeyPressed = 0; } foreach (var visual_object in __GameObjects) { visual_object?.Update(); } var bullets_to_remove = new List <Bullet>(); foreach (var bullet in __Bullets) { bullet.Update(); if (bullet.Position.X > Width) { bullets_to_remove.Add(bullet); } } //__Bullet?.Update(); for (var i = 0; i < __GameObjects.Length; i++) { var obj = __GameObjects[i]; if (obj is ICollision) // Применить "сопоставление с образцом"! { var collision_object = (ICollision)obj; __Ship.CheckCollision(collision_object); foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(collision_object)) { bullets_to_remove.Add(bullet); __GameObjects[i] = null; MessageBox.Show("Астероид уничтожен!", "Столкновение", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } //if (__Bullets.Any(b => b.CheckCollision(collision_object))) //{ // __GameObjects[i] = null; // MessageBox.Show("Астероид уничтожен!", "Столкновение", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //} //foreach (var bullet in __Bullets.Where(b => b.CheckCollision(collision_object))) // __Bullets.Remove(bullet); } } foreach (var bullet in bullets_to_remove) { __Bullets.Remove(bullet); } }
// обновление для всех объектов через класс Game public static void Update() { if (__KeyPressedCtrl > 0) { for (int i = 0; i < __KeyPressedCtrl; i++) { __Bullets.Add(new Bullet(__Ship.Position.X + 30, __Ship.Position.Y + 10)); } __KeyPressedCtrl = 0; } if (__KeyPressedUp > 0) { for (int i = 0; i < __KeyPressedUp; i++) { __Ship.MoveUp(); } __KeyPressedUp = 0; } if (__KeyPressedDown > 0) { for (int i = 0; i < __KeyPressedDown; i++) { __Ship.MoveDown(); } __KeyPressedDown = 0; } if (__KeyPressedLeft > 0) { for (int i = 0; i < __KeyPressedLeft; i++) { __Ship.MoveLeft(); } __KeyPressedLeft = 0; } if (__KeyPressedRight > 0) { for (int i = 0; i < __KeyPressedRight; i++) { __Ship.MoveRight(); } __KeyPressedRight = 0; } if (__KeyPressedF1 > 0) { if (__Ship.Score >= 1000) { __Ship.Score -= 1000; __Ship.Energy += 50; } __KeyPressedF1 = 0; } foreach (var visual_object in __GameObjects) { visual_object?.Update(); } foreach (var asteroid in __AsteroidList) { asteroid?.Update(); } if (__AsteroidList.Count <= 0) { //TODO При убийстве всех астероидов будет прибавляться 1000 очков и 100 ХП __Ship.Score += 300; __Ship.Energy += 30; Level.LevelGame++; AsteroidListCreate(__AsteroidList, rnd); } var bullets_to_remove = new List <Bullet>(); var asteroids_to_remove = new List <Asteroid>(); // добавили список на удаление астероидов foreach (var bullet in __Bullets) { bullet.Update(); if (bullet.Position.X > Width) { bullets_to_remove.Add(bullet); } } for (int i = 0; i < __AsteroidList.Count; i++) { var obj = __AsteroidList[i]; if (obj is ICollision) { var collision_object = (ICollision)obj; __Ship.CheckCollision(collision_object); foreach (var bullet in __Bullets.ToArray()) { if (bullet.CheckCollision(collision_object)) { // сперва добавляем все элементы которые хотим удалить в промежуточный список, // а уже затем удаляем список в другом цикле bullets_to_remove.Add(bullet); asteroids_to_remove.Add((Asteroid)collision_object); //TODO И что мне делать двойное кастование? //TODO при попадании выстрелом в астероид будут начисляться очки __Ship.Score += 100; } } //TODO Пока такой способ, при столкновении корабля с астероидами, астероид уничтожается, корабль повреждается if (__Ship != null && __Ship.CheckCollision(collision_object)) { //TODO При столкновении с кораблем астероид взрывается //__AsteroidList.Remove(obj); asteroids_to_remove.Add((Asteroid)collision_object); //TODO И что мне делать двойное кастование? //TODO При столкновении корабля с астероидами отнимаются не только жизни, но и очки __Ship.Score -= 50; } } } foreach (var asteroid in asteroids_to_remove) { __AsteroidList.Remove(asteroid); // удалил астероиды вне цикла итерации выше. Log?.Invoke($"Астероид {asteroid} уничтожен"); } // Метод удаления и использованием linq мне не понравился, так как там не исчезали пули. foreach (var bullet in bullets_to_remove) { __Bullets.Remove(bullet); } }