/// <summary>
 /// Нажата ли хотя бы одна из кнопок, отвечающая за подтверждение или осуществление игрового действия игроком
 /// </summary>
 /// <param name="parPlayerRef">Ссылка на объект информации об игроке</param>
 /// <returns></returns>
 public bool IsActionButtonPressed(MPlayer parPlayerRef)
 {
     return(IsButtonPressed(parPlayerRef, EGameActionButton.Button_A) ||
            IsButtonPressed(parPlayerRef, EGameActionButton.Button_B) ||
            IsButtonPressed(parPlayerRef, EGameActionButton.Button_X) ||
            IsButtonPressed(parPlayerRef, EGameActionButton.Button_Y));
 }
        /// <summary>
        /// Является ли игрок активным в текущий момент
        /// </summary>
        /// <param name="parPlayerId">Идентификатор игрока</param>
        /// <returns>True, если игрок активен</returns>
        public bool IsPlayerActive(string parPlayerId)
        {
            MPlayer foundPlayer = _players.FirstOrDefault(parX => parX.PlayerId == parPlayerId);

            if (foundPlayer != null)
            {
                return(foundPlayer.IsActive);
            }

            return(false);
        }
        /// <summary>
        /// Удалить игрока из игры
        /// </summary>
        /// <param name="parPlayerId">Данные об удаляемом игроке</param>
        public void RemovePlayer(string parPlayerId)
        {
            MPlayer foundPlayer = _players.FirstOrDefault(parX => parX.PlayerId == parPlayerId);

            if (foundPlayer == null)
            {
                return;
            }

            _players.Remove(foundPlayer);
            OnPlayerRemoved?.Invoke(foundPlayer);
        }
        /// <summary>
        /// Получить состояние игровой кнопки для определенного игрока
        /// </summary>
        /// <param name="parPlayerId">Идентификатор игрока</param>
        /// <param name="parActionId">Тип игровой кнопки</param>
        /// <returns></returns>
        public MGameActionButton GetGameActionButton(string parPlayerId, EGameActionButton parActionId)
        {
            MPlayer foundPlayer = _players.FirstOrDefault(parX => parX.PlayerId == parPlayerId);

            if (foundPlayer != null)
            {
                if (foundPlayer.IsActive)
                {
                    return(foundPlayer.GetGameActionButton(parActionId));
                }
            }

            return(new MGameActionButton());
        }
        /// <summary>
        /// Получить состояние игровой оси для определенного игрока
        /// </summary>
        /// <param name="parPlayerId">Идентификатор игрока</param>
        /// <param name="parActionId">Тип игровой оси</param>
        /// <returns></returns>
        public MGameActionAxis GetGameActionAxis(string parPlayerId, EGameActionAxis parActionId)
        {
            MPlayer foundPlayer = _players.FirstOrDefault(parX => parX.PlayerId == parPlayerId);

            if (foundPlayer != null)
            {
                if (foundPlayer.IsActive)
                {
                    return(foundPlayer.GetGameActionAxis(parActionId));
                }
            }

            return(new MGameActionAxis(AppInfoConsts.AxisDefaultValue));
        }
 /// <summary>
 /// Добавить игрока
 /// </summary>
 /// <param name="parNewPlayer">Данные о новом игроке</param>
 public void AddPlayer(MPlayer parNewPlayer)
 {
     _players.Add(parNewPlayer);
     OnPlayerAdded?.Invoke(parNewPlayer);
 }
 /// <summary>
 /// Удерживает ли игрок определенную игровую кнопку?
 /// </summary>
 /// <param name="parPlayerRef">Ссылка на объект информации об игроке</param>
 /// <param name="parButtonId">Тип игровой кнопки</param>
 /// <returns>True, если удерживает</returns>
 public bool IsButtonHolding(MPlayer parPlayerRef, EGameActionButton parButtonId)
 {
     return(parPlayerRef.GetGameActionButton(parButtonId).IsHolding);
 }
 /// <summary>
 /// Отпущена ли сейчас игровая кнопка игроком? Отпускание кнопки является событие перехода кнопки
 /// из состояния "зажата" в состояние "не нажата"
 /// </summary>
 /// <param name="parPlayerRef">Ссылка на объект информации об игроке</param>
 /// <param name="parButtonId">Тип игровой кнопки</param>
 /// <returns></returns>
 public bool IsButtonReleased(MPlayer parPlayerRef, EGameActionButton parButtonId)
 {
     return(parPlayerRef.GetGameActionButton(parButtonId).IsReleasedFrame);
 }