/// <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; } }
/// <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); }