Esempio n. 1
0
        /// <summary>
        /// Обновляет состояние игрового поля.
        /// </summary>
        public void Update(GameTime gameTime)
        {
            // Пытаемся изменить состояние игры
            ChangeState();

            // Действие разрушителей
            List <Destroyer> destroyerListCopy = new List <Destroyer>(destroyerList);

            foreach (Destroyer destroyer in destroyerListCopy)
            {
                foreach (GameBoardObject gameBoardObject in objectList)
                {
                    Rectangle boundingBox      = gameBoardObject.GetScreenBoundingBox();
                    bool      boundingBoxHit   = boundingBox.Contains(GameBoardObject.WorldToScreen(destroyer.spriteWorldPos));
                    bool      alreadyImploding = implodingObjects.Contains(gameBoardObject);
                    if (boundingBoxHit && !alreadyImploding)
                    {
                        implodingObjects.Add(gameBoardObject);
                        ScaleAnimation implodeAnimation = new ScaleAnimation(
                            gameBoardObject,
                            beginScale: 1.0,
                            endScale: 0.0,
                            delay: 0.0,
                            blocking: true,
                            finishedCallback: _ => objectList.Remove(gameBoardObject)
                            );
                        activeAnimations.Add(implodeAnimation);
                        score++;
                        // Если это LineBonus
                        if (gameBoardObject.GetType() == typeof(LineBonus))
                        {
                            TriggerLineBonus((LineBonus)gameBoardObject);
                        }
                        // Если это BombBonus
                        if (gameBoardObject.GetType() == typeof(BombBonus))
                        {
                            TriggerBombBonus((BombBonus)gameBoardObject);
                        }
                    }
                }
            }

            // Обновляем состояние анимаций
            activeAnimations.ForEach(animation => animation.Update(gameTime));
            // Удаляем завершившиеся анимации
            List <Animation> animationsToDelete = activeAnimations.FindAll(animation => !animation.active);

            animationsToDelete.ForEach(animation => animation.OnDelete());
            activeAnimations = activeAnimations.Except(animationsToDelete).ToList();

            // Синхронизируем список implodingObjects с основным списком
            implodingObjects = implodingObjects.Intersect(objectList).ToList();

            // Уменьшаем остаток времени
            if (currentGamePhase != GamePhase.MainMenu && currentGamePhase != GamePhase.GameOver)
            {
                timeRemaining -= gameTime.ElapsedGameTime.TotalSeconds;
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Рисует объект на экране.
        /// </summary>
        public virtual void Draw(SpriteBatch spriteBatch)
        {
            // Позиция спрайта на экране
            Vector2 spriteScreenPos = GameBoardObject.WorldToScreen(spriteWorldPos);
            // Центр спрайта
            Vector2 spriteOffset = new Vector2(sprite.Width / 2, sprite.Height / 2);
            // Масштабирование спрайта
            float finalSpriteScale = Game1.cellSize / sprite.Width * spriteScale * spriteAnimatedScale * Game1.globalSpriteScale;

            // Отрисовка спрайта
            spriteBatch.Draw(sprite, spriteScreenPos, null, Color.White, 0f, spriteOffset, finalSpriteScale, SpriteEffects.None, 0f);
        }