示例#1
0
        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);
                }
            }
        }
示例#2
0
文件: Game.cs 项目: Nix7773/Dz2
        /// <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);
                    }
                }
            }
        }
示例#3
0
        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();
            }
        }
示例#4
0
        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();
                        }
                    }
                }
            }
        }
示例#5
0
        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();
            }
        }
示例#6
0
        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));
                }
            }
        }
示例#7
0
        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("Астероид уничтожен");
                        }
                    }
                }
            }
        }
示例#8
0
        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);
            }
        }
示例#9
0
        /// <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)));
                }
            }
        }
示例#10
0
        /// <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);
            }
        }
示例#11
0
        //  обновление для всех объектов через класс 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);
            }
        }