Example #1
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);
        }
Example #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 (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);
        }