///////////////////////////////////////////////////////////////////////////////// // ПРОРИСОВКА ИГРОВОГО ПОЛЯ /// <summary> /// Метод отрисовывает информационное поле игры (очки, уровень, состояние) /// </summary> private void DrawInfo() { string S1, S2 = String.Format(" В розыгрыше: {0,4:D} ", currentScore), S3 = String.Format(" Выигрыш: {0,6:D} ", score), S4 = String.Format(" Съедено: {0,5:D} ", ateApples), S5 = String.Format(" Осталось съесть: {0,2:D} ", applesQuantity - currentScore / SMult); if (isWorking) { S1 = String.Format(" УРОВЕНЬ {0,2:D} ", levelNumber + 1); } else { S1 = " ПАУЗА "; } float StrUp = Tile.Height * 0.15f, StrDown = BackBufferHeight - Tile.Height * 0.8f; // Векторы позиций для отображения элементов учитывают смещение камеры наблюдения Vector2 V1 = new Vector2(BackBufferWidth * 0.05f, StrUp) + level.CameraPosition, V2 = new Vector2(BackBufferWidth * 0.21f, StrUp) + level.CameraPosition, V3 = new Vector2(BackBufferWidth * 0.50f, StrUp) + level.CameraPosition, V4 = new Vector2(BackBufferWidth * 0.80f, StrUp) + level.CameraPosition, V5 = new Vector2(BackBufferWidth * 0.05f, StrDown) + level.CameraPosition, V6 = new Vector2(BackBufferWidth * 0.89f, StrDown) + level.CameraPosition, V7 = new Vector2(BackBufferWidth * 0.92f, StrDown) + level.CameraPosition; DrawShadowedString(defFont, S1, V1, SnakeGameColors.LRed); DrawShadowedString(defFont, S2, V2, SnakeGameColors.Yellow); DrawShadowedString(defFont, S3, V3, SnakeGameColors.Green); DrawShadowedString(defFont, S4, V4, SnakeGameColors.LBlue); // Если игра идёт, выводить строку "осталось съесть" if (isAlive) { DrawShadowedString(defFont, S5, V5, SnakeGameColors.Silver); } // Если есть музыка или звук, выводить соответствующий знак if (isMusic) { DrawShadowedString(defFont, "[\x266B]", V6, SnakeGameColors.Yellow); } else { DrawShadowedString(defFont, "[\x266B]", V6, SnakeGameColors.Black); } if (isSound) { DrawShadowedString(defFont, "[\x266A]", V7, SnakeGameColors.Yellow); } else { DrawShadowedString(defFont, "[\x266A]", V7, SnakeGameColors.Black); } // КОМПАС // Смена цвета стрелки компаса Color compasColor = SnakeGameColors.CompasRed; if (GameAuxFunctions.VDist(playerPosition[0], applePosition) < GameAuxFunctions.VDist(compasOffs, applePosition)) { compasColor = SnakeGameColors.CompasGreen; } // Положение стрелки компаса compasOffs = playerPosition[0]; compasPosition.X = (int)playerPosition[0].X; compasPosition.Y = (int)playerPosition[0].Y; Vector2 V8 = applePosition - playerPosition[0]; // Формула движения стрелки компаса и её отображение compasTurn = (float)Math.Acos(V8.X / GameAuxFunctions.VDist(V8, Vector2.Zero)) * GameAuxFunctions.NNSign(V8.Y, true); spriteBatch.Draw(compas, compasPosition, compasSize, compasColor, compasTurn, new Vector2(compas.Width, compas.Height) / 2, SpriteEffects.None, 0.0f); }
/// <summary> /// Метод отрисовывает уровень игры /// </summary> /// <param name="VGameTime">Время игры</param> protected override void Draw(GameTime VGameTime) { // Создание чистого окна и запуск рисования graphics.GraphicsDevice.Clear(SnakeGameColors.DGreen); spriteBatch.Begin(); // В ЗАВИСИМОСТИ ОТ СОСТОЯНИЯ ИГРЫ switch (gameStatus) { ////////////////////////////////////////////////////////////////// case GameStatus.Start: ShowStartMessage(); break; ////////////////////////////////////////////////////////////////// case GameStatus.Help: ShowHelpMessage(); break; ////////////////////////////////////////////////////////////////// case GameStatus.Playing: // ОТОБРАЖЕНИЕ УРОВНЯ level.Draw(VGameTime, spriteBatch, playerPosition[0]); // ОТОБРАЖЕНИЕ АНИМИРОВАННЫХ ИХОБРАЖЕНИЙ // Яблоко appleAnimator.Draw(VGameTime, spriteBatch, applePosition, SpriteEffects.None, SnakeGameColors.White, 0.0); // Тело змейки for (int n = 1; n < playerPosition.Count; n++) { bodyAnimator.Draw(VGameTime, spriteBatch, playerPosition[n], SpriteEffects.None, SnakeGameColors.White, 0.0); } // Голова змейки headAnimator.Draw(VGameTime, spriteBatch, playerPosition[0], SpriteEffects.None, SnakeGameColors.White, // Изменение угла поворота текстуры Math.Acos(Math.Sign(playerTo.X)) * GameAuxFunctions.NNSign(playerTo.Y, true)); // ОТОБРАЖЕНИЕ ИНФОРМАЦИИ DrawInfo(); // Отображение сообщений Vector2 backBufferSize = new Vector2(SnakeGame.BackBufferWidth, SnakeGame.BackBufferHeight); if (showLevelMsg) { messageBackAnimator.Draw(VGameTime, spriteBatch, GameAuxFunctions.CenterOf(backBufferSize, level.CameraPosition), SpriteEffects.None, SnakeGameColors.LBlue_B, 0.0); ShowLevelMessage(); } if (showWinMsg) { messageBackAnimator.Draw(VGameTime, spriteBatch, GameAuxFunctions.CenterOf(backBufferSize, level.CameraPosition), SpriteEffects.None, SnakeGameColors.Green_B, 0.0); ShowWinMessage(); } if (showLoseMsg) { messageBackAnimator.Draw(VGameTime, spriteBatch, GameAuxFunctions.CenterOf(backBufferSize, level.CameraPosition), SpriteEffects.None, SnakeGameColors.Red_B, 0.0); ShowLoseMessage(); } if (showExitMsg) { messageBackAnimator.Draw(VGameTime, spriteBatch, GameAuxFunctions.CenterOf(backBufferSize, level.CameraPosition), SpriteEffects.None, SnakeGameColors.Yellow_B, 0.0); ShowExitMessage(); } break; ////////////////////////////////////////////////////////////////// case GameStatus.Finish: ShowFinishMessage(); break; } // Отключение устройства рисования spriteBatch.End(); // Перерисовка base.Draw(VGameTime); }
/// <summary> /// Метод отрисовывает уровень игры /// </summary> /// <param name="VGameTime"></param> protected override void Draw(GameTime VGameTime) { // Создание чистого окна и запуск рисования graphics.GraphicsDevice.Clear(TurtleGameColors.Black); spriteBatch.Begin(); // В ЗАВИСИМОСТИ ОТ СОСТОЯНИЯ ИГРЫ switch (gameStatus) { ////////////////////////////////////////////////////////////////// case GameStatus.Start: // Отображает стартовый экран ShowStartMessage(); break; ////////////////////////////////////////////////////////////////// case GameStatus.Help: ShowHelpMessage(); break; ////////////////////////////////////////////////////////////////// case GameStatus.Playing: // ОТОБРАЖЕНИЕ УРОВНЯ level.Draw(VGameTime, spriteBatch, playerPosition); // ОТОБРАЖЕНИЕ ИЗОБРАЖЕНИЙ // Съедобные объекты for (int i = 0; i < eatable.Count; i++) { spriteBatch.Draw(eatableTextures[eatable[i].TextureNumber], eatable[i].DestinationRect, eatable[i].SourceRect, TurtleGameColors.White, eatable[i].Turn, eatable[i].Origin, SpriteEffects.None, 0.0f); } // Игрок (над ними) playerAnimator.Draw(VGameTime, spriteBatch, playerPosition, SpriteEffects.None, TurtleGameColors.White, // Изменение угла поворота текстуры Math.Acos(playerTo.X) * GameAuxFunctions.NNSign(playerTo.Y, false)); // Автомобили (ещё выше) for (int i = 0; i < carPosition.Count; i++) { spriteBatch.Draw(carTextures[carPosition[i].TextureNumber], carPosition[i].DestinationRect, carPosition[i].SourceRect, TurtleGameColors.White, carPosition[i].Turn, carPosition[i].Origin, SpriteEffects.None, 0.0f); } // ОТОБРАЖЕНИЕ ИНФОРМАЦИИ УРОВНЯ DrawInfo(); // Отображение сообщений (если они вызваны) if (showLevelMsg) { ShowLevelMessage(); } if (showWinMsg) { ShowWinMessage(); } if (showLoseMsg) { ShowLoseMessage(); } if (showExitMsg) { ShowExitMessage(); } break; ////////////////////////////////////////////////////////////////// case GameStatus.Finish: ShowFinishMessage(); break; } // Завершение рисования spriteBatch.End(); // Перерисовка base.Draw(VGameTime); }