/
karachi
/
KPO_CP_CrossyRoad
Обзор
Документация
Войти
/
karachi
/
KPO_CP_CrossyRoad
Код
Запросы
5
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
console
ControllerConsole/GameControllerConsole.cs
241 строка
7 KB
karachi-23
console
11 янв 2025, 00:00
11 янв 2025, 00:00
3330cd2
Код
Авторство
О чём код?
using Controller.Game; using Model.Game; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using View.Game; using ViewConsole; using ViewConsole.Game; namespace ControllerConsole { /// <summary> /// Контроллер игры в консоли /// </summary> public class GameControllerConsole : GameController { /// <summary> /// Событие нажатия клавиши в консоли /// </summary> private event Action<ConsoleKeyInfo> KeyDown = null!; /// <summary> /// Флаг продолжения работы с игрой /// </summary> private volatile bool _needExit = false; /// <summary> /// Контроллер меню паузы /// </summary> private MenuPauseControllerConsole _menuPauseControllerConsole; /// <summary> /// Контроллер меню паузы, отвечающий за экран при смерти игрока /// </summary> private MenuPauseControllerConsole _deathScreenConsole; /// <summary> /// Флаг нажатия левой стрелки /// </summary> private bool wasLeftKeyPressed = false; /// <summary> /// Флаг нажатия правой стрелки /// </summary> private bool wasRightKeyPressed = false; /// <summary> /// Флаг нажатия стрелки вверх /// </summary> private bool wasUpKeyPressed = false; /// <summary> /// Конструктор контроллера игры в консоли /// </summary> public GameControllerConsole() { _menuPauseControllerConsole = new(); _menuPauseControllerConsole.MenuPauseController.Continue += () => { GameView.OnStartGame(); ResumeGame(); }; _menuPauseControllerConsole.MenuPauseController.BackToMenu += StopGame; _deathScreenConsole = new(); _deathScreenConsole.MenuPauseController.Continue += () => { StopGame(); }; _deathScreenConsole.MenuPauseController.BackToMenu += StopGame; GameInstance.Map.PlayerDead += OnPlayerDead; GameView = CreateGameView(); } /// <summary> /// Запуск игры /// </summary> public override void Start() { base.Start(); _needExit = false; if (Console.KeyAvailable) { ConsoleKeyInfo key = Console.ReadKey(true); KeyDown?.Invoke(key); } do { ((GameViewConsole)GameView).Render(); } while (!_needExit); } /// <summary> /// Обновляет позицию игрока при нажатии пользователем на клавишу /// </summary> private void PlayerPositionUpdateHandler() { bool leftKeyNowPressed = ConsoleHelperUtilite.IsKeyPressed(ConsoleKey.LeftArrow); bool rightKeyNowPressed = ConsoleHelperUtilite.IsKeyPressed(ConsoleKey.RightArrow); bool upKeyNowPressed = ConsoleHelperUtilite.IsKeyPressed(ConsoleKey.UpArrow); if (leftKeyNowPressed && !wasLeftKeyPressed) { LeftKeyPressed = true; wasLeftKeyPressed = true; SetPlayerPosition(); } else if (!leftKeyNowPressed && wasLeftKeyPressed) { LeftKeyPressed = false; wasLeftKeyPressed = false; } if (rightKeyNowPressed && !wasRightKeyPressed) { RightKeyPressed = true; wasRightKeyPressed = true; SetPlayerPosition(); } else if (!rightKeyNowPressed && wasRightKeyPressed) { RightKeyPressed = false; wasRightKeyPressed = false; } if (upKeyNowPressed && !wasUpKeyPressed) { UpKeyPressed = true; wasUpKeyPressed = true; SetPlayerPosition(); } else if (!upKeyNowPressed && wasUpKeyPressed) { UpKeyPressed = false; wasUpKeyPressed = false; } } /// <summary> /// Обработка установки игроком паузы /// </summary> /// <param name="parKeyInfo">Информация о нажатии</param> private void PlayerPauseCheck() { bool PKeyNowPressed = ConsoleHelperUtilite.IsKeyPressed(ConsoleKey.P); if (PKeyNowPressed) { PauseGame(); _menuPauseControllerConsole.Start(); } } /// <summary> /// Обработка возобновления игры /// </summary> /// <param name="parKeyInfo">Информация о нажатии</param> private void PlayerResumeCheck(ConsoleKeyInfo parKeyInfo) { if (parKeyInfo.Key == ConsoleKey.Enter) ResumeGame(); } /// <summary> /// Получение представления игры /// </summary> /// <returns>Представление игры</returns> protected override GameView CreateGameView() { return new GameViewConsole(); } /// <summary> /// Выключение обработки установки паузы игроком /// </summary> protected override void ResetHandlerPlayerPaused() { GameInstance.CanRender -= PlayerPauseCheck; } /// <summary> /// Выключение обработки возобновления игры игроком /// </summary> protected override void ResetHandlerPlayerResumed() { KeyDown -= PlayerResumeCheck; } /// <summary> /// Выключение обработки установки позиции игроком /// </summary> protected override void ResetHandlerPlayerPositionSet() { GameInstance.CanRender -= PlayerPositionUpdateHandler; } /// <summary> /// Включение обработки установки паузы игроком /// </summary> protected override void SetHandlerPlayerPaused() { GameInstance.CanRender += PlayerPauseCheck; } /// <summary> /// Включение обработки возобновления игры игроком /// </summary> protected override void SetHandlerPlayerResumed() { KeyDown += PlayerResumeCheck; } /// <summary> /// Включение обработки установки позиции игроком /// </summary> protected override void SetHandlerPlayerPositionSet() { GameInstance.CanRender += PlayerPositionUpdateHandler; } /// <summary> /// Обработка смерти игрока /// </summary> /// <param name="parPlayer">Игрок</param> private void OnPlayerDead(Player parPlayer) { StopGame(); _deathScreenConsole.Start(); } /// <summary> /// Возобновления обработчика сметри игрока /// </summary> protected override void SetHandlerPlayerDead() { GameInstance.Map.PlayerDead += OnPlayerDead; } /// <summary> /// Выключение обработчика смерти игрока /// </summary> protected override void ResetHandlerPlayerDead() { GameInstance.Map.PlayerDead -= OnPlayerDead; } } }