/// <summary> /// Метод-обработчик динамических событий игры /// </summary> /// <param name="gameTime"></param> protected override void Update(GameTime gameTime) { // Опрос клавиатуры с предотвращением повторов kbdDelayTimer++; kbdDelayTimer %= kbdDelay; if (kbdDelayTimer == 0) { if (KeyboardProc()) { kbdDelay = KbdDefDelay; kbdDelayTimer = 0; } else { kbdDelay = 1; } } KeyboardMoveProc(); // В ЗАВИСИМОСТИ ОТ СОСТОЯНИЯ ИГРЫ switch (gameStatus) { ////////////////////////////////////////////////////////////////// case GameStatus.Start: case GameStatus.Help: // Движение по синусоиде startSnakeVector.X += 2; startSnakeVector.Y = BackBufferHeight - snakeImg.Height / 2 - 190 + 12 * (float)Math.Sin(0.007 * startSnakeVector.X + 0.5); if (startSnakeVector.X > BackBufferWidth + snakeImg.Width) { startSnakeVector.X = -snakeImg.Width; } break; ////////////////////////////////////////////////////////////////// case GameStatus.Playing: // Модуль движения (в случае IsAlive) if (isAlive && isWorking) { playerPosition[0] += playerTo; for (int n = 1; n < playerPosition.Count; n++) { ////////////////////////////////////////////////////////////////////// // ФОРМУЛА ПЛАВНОГО ДВИЖЕНИЯ ЗМЕЙКИ playerPosition[n] += speed * (playerPosition[n - 1] - playerPosition[n]) / Tile.Size; ////////////////////////////////////////////////////////////////////// // Если часть тела пытается залезть на камень, она // отодвигается от него ровно в противоположном направлении if (IsCollapted(playerPosition[n], false)) { playerPosition[n] += new Vector2(Math.Sign(playerPosition[n].X - collaptedOn.X), Math.Sign(playerPosition[n].Y - collaptedOn.Y)); } } } // Новый уровень с паузой (выигрыш) if (currentScore == SMult * applesQuantity) { // Звук MediaPlayer.Stop(); if (isSound) { SCompleted.Play(); } // Пересчёт очков score += currentScore; currentScore = 0; // Отображение сообщения showWinMsg = true; // Запуск нового уровня с паузой isAlive = isWorking = false; // Перезапуск уровня произойдёт по нажатию клавиши } // Проверка столкновений if (IsCollapted(playerPosition[0], true) && isAlive) { // Звук MediaPlayer.Stop(); if (isSound) { SFailed.Play(); } // Переключение состояния игры isAlive = isWorking = false; levelNumber--; headAnimator.PlayAnimation(headRushAnimation); // Пересчёт очков score += currentScore / SMult - applesQuantity; currentScore = 0; // Отображение сообщения showLoseMsg = true; // Перезапуск уровня произойдёт по нажатию клавиши Space } // Новое яблоко if (IsAte()) { // Звук if (isSound) { SAte[rnd.Next(SAte.Length)].Play(); } // Генерация нового яблока (если игра не окончена) NewApple(); // Наращивание текущего числа очков и всего съеденных ябок currentScore += SMult; ateApples++; // Добавление части змейки playerPosition.Add(playerPosition[playerPosition.Count - 1]); } break; ////////////////////////////////////////////////////////////////// } // Обновление игры base.Update(gameTime); }
/// <summary> /// Метод обновляет состояние игры в реальном времени /// </summary> /// <param name="VGameTime"></param> protected override void Update(GameTime VGameTime) { // Опрос клавиатуры с предотвращением повторов kbdDelayTimer++; kbdDelayTimer %= kbdDelay; if (kbdDelayTimer == 0) { if (KeyboardProc()) { kbdDelay = kbdDefDelay; kbdDelayTimer = 0; } else { kbdDelay = 1; } } KeyboardMoveProc(); // В ЗАВИСИМОСТИ ОТ СОСТОЯНИЯ ИГРЫ switch (gameStatus) { ////////////////////////////////////////////////////////////////// case GameStatus.Playing: if (isAlive) { // Выигрыш (запуск нового уровня с паузой) if (playerPosition.X > level.Background.Width - playerAnimation.FrameWidth / 2) { // Звук MediaPlayer.Stop(); if (isSound) { SCompleted.Play(); } // Отображение сообщения showWinMsg = true; // Переключение параметров isAlive = isWorking = false; playerAnimator.PlayAnimation(playerStayAnimation); // Перезапуск уровня произойдёт по нажатию клавиши } // Движение всех машин if (isWorking) { for (int i = 0; i < carPosition.Count; i++) { // Смещение carPosition[i].CurrentPosition += carPosition[i].MoveTo * carPosition[i].Speed; // Выход за границы уровня if ((carPosition[i].CurrentPosition.Y < -CarState.DefaultHeight) || (carPosition[i].CurrentPosition.Y > TurtleGame.GameFieldBottom + CarState.DefaultHeight)) { // При выходе за границы уровня машина удаляется из массива, а вместо неё // создаётся новая, но с той же скоростью и на той же полосе carPosition[i].CurrentPosition = carPosition[i].StartPosition; } } } // Проверка столкновений с машинами if (IsCollapted()) { // Звук MediaPlayer.Stop(); if (isSound) { SFailed.Play(); } // Переключение состояния игры isAlive = isWorking = false; levelNumber--; playerAnimator.PlayAnimation(deadAnimation); // Отображение сообщения showLoseMsg = true; // Пересчёт очков score -= penalty; // Размер штрафа // Перезапуск уровня произойдёт по нажатию клавиши Space } // Проверка съедений Vector2 k = IsAte(); if (k.X != -1.0f) { // Удаление съеденного объекта eatable.RemoveAt((int)k.X); // Пересчёт очков score += (int)((k.Y + 1.0f) * scoreMultiplier); // Звук SAte.Play(); } } break; ////////////////////////////////////////////////////////////////// } // Обновление игры base.Update(VGameTime); }