Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }