/// <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); }
///////////////////////////////////////////////////////////////////////////////// // ДИНАМИЧЕСКИЕ СОБЫТИЯ ИГРЫ /// <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 (isWorking) { // Движение текстуры дороги if (backOffset.Y + currentSpeed >= 0.0f) { backOffset.Y = -back.Height / 2; } else { backOffset.Y += currentSpeed; } // Движение съедобного объекта if (eatablePosition.Y + currentSpeed >= BackBufferHeight + eatable.FrameHeight) { eatablePosition.X = rnd.Next(RoadLeft + eatable.FrameWidth / 2, RoadLeft + RoadLineWidth * LinesQuantity - eatable.FrameWidth / 2); eatablePosition.Y = -BackBufferHeight; } else { eatablePosition.Y += currentSpeed; } // Движение околодорожного объекта if (bythePosition.Y > BackBufferHeight + bytheTextures[bytheTextureNumber].Height) { bytheTextureNumber = rnd.Next(bytheTextures.Length); bythePosition.X = (3 * RoadLeft / 2 - bytheTextures[bytheTextureNumber].Width) / 2; bythePosition.Y = -bytheTextures[bytheTextureNumber].Height; bytheShow = rnd.Next(2); } else { bythePosition.Y += currentSpeed; } // Движение машин for (int j = 0; j < carPosition.GetLength(1); j++) { for (int i = 0; i < carPosition.GetLength(0); i++) { // Смещение всех машин carPosition[i, j].SetCurrentPosY(carPosition[i, j].CurrentPosition.Y + currentSpeed / 2); } // Обгон //if ((int)CarPosition[0, j].CurPos.Y == BackBufferHeight - 2 * CarState.DefHeight) // if(IsSound) //SBythe.Play (); // Выход за границы уровня if (carPosition[0, j].CurrentPosition.Y > BackBufferHeight + CarState.DefHeight) // При выходе за границы уровня машина возвращается наверх { int s = 0; for (int i = 0; i < carPosition.GetLength(0); i++) { score += carPosition[i, j].Enabled; carPosition[i, j].Enabled = rnd.Next(2); s += carPosition[i, j].Enabled; carPosition[i, j].TextureNumber = rnd.Next(carTextures.Length); carPosition[i, j].SetCurrentPosY(-BackBufferHeight); } if (levelNumber <= 12) { // Если (внезапно) все восемь машин окажутся активными if (s == carPosition.GetLength(0)) { carPosition[rnd.Next(carPosition.GetLength(0)), j].Enabled = 0; } } else if (levelNumber <= 17) { // Если будет больше четырёх машин if (s > (carPosition.GetLength(0) / 2)) { for (int i = 0; i < carPosition.GetLength(0); i++) { carPosition[i, j].Enabled = 0; } carPosition[rnd.Next(carPosition.GetLength(0)), j].Enabled = 1; carPosition[rnd.Next(carPosition.GetLength(0)), j].Enabled = 1; carPosition[rnd.Next(carPosition.GetLength(0)), j].Enabled = 1; carPosition[rnd.Next(carPosition.GetLength(0)), j].Enabled = 1; } } else if (levelNumber <= 22) { if (s > (carPosition.GetLength(0) / 4)) { for (int i = 0; i < carPosition.GetLength(0); i++) { carPosition[i, j].Enabled = 0; } carPosition[rnd.Next(carPosition.GetLength(0)), j].Enabled = 1; carPosition[rnd.Next(carPosition.GetLength(0)), j].Enabled = 1; } } else if (levelNumber <= 28) { if (s > (carPosition.GetLength(0) / 8)) { for (int i = 0; i < carPosition.GetLength(0); i++) { carPosition[i, j].Enabled = 0; } carPosition[rnd.Next(carPosition.GetLength(0)), j].Enabled = 1; } } else { carPosition[carPosition.GetLength(0) - 1, j].Enabled = 0; } // Начисление очков carsLeft++; } } } // Следующий уровень if (carsLeft >= levelNumber * scoreMultiplier / 2) { if (isSound) { NewLev.Play(); } carsLeft = 0; levelNumber++; if (levelNumber > levelsQuantity) { LoadNextLevel(); } currentSpeed = levelNumber + 2; // Запись настроек и результатов игры (в зависимости от того, есть они или нет) GameSettings(true); } // Проверка столкновений с машинами if (IsCollapted()) { // Звук MediaPlayer.Stop(); if (isSound) { SFailed.Play(); } // Запись настроек и результатов игры (в зависимости от того, есть они или нет) GameSettings(true); // Переключение состояния игры isAlive = isWorking = false; levelNumber--; carsLeft = 0; // Это было бы слишком просто... playerAnimator.PlayAnimation(deadAnimation); // Отображение сообщения showLoseMsg = true; // Пересчёт очков score -= penalty; // Размер штрафа // Перезапуск уровня произойдёт по нажатию клавиши Space } // Проверка съедений if (IsAte()) { // Удаление съеденного объекта eatablePosition.X = rnd.Next(RoadLeft + eatable.FrameWidth / 2, RoadLeft + RoadLineWidth * LinesQuantity - eatable.FrameWidth / 2); eatablePosition.Y = -back.Height; // Пересчёт очков score += 5 * scoreMultiplier; // Звук SAte.Play(); } } break; ////////////////////////////////////////////////////////////////// } // Обновление игры base.Update(VGameTime); }