/// /// Абстрактный базовый класс для всех источников ввода в системе. /// Определяет унифицированный интерфейс для работы с аппаратными кнопками и виртуальными действиями игроков. /// /// /// Наследники этого класса реализуют конкретные способы ввода: /// - COMinput: работа с периферийной платой через COM-порт /// - KeyboardInput: эмуляция ввода с клавиатуры для тестирования /// /// Класс предоставляет три уровня абстракции: /// 1. Низкоуровневый доступ к физическим пинам /// 2. Доступ к абстрактным игровым действиям /// 3. Мультиплеерные методы для работы с несколькими игроками /// public abstract class InputSource { /// /// Инициализирует источник ввода. Должен быть вызван перед использованием других методов. /// /// true если инициализация прошла успешно, false в случае ошибки public abstract bool Initialize(); //---------------------------------------------------------------------------------- /// /// Получает текущее состояние конкретной кнопки по её физическому пину. /// /// Пин кнопки на периферийной плате /// true если кнопка нажата в текущий момент public abstract bool GetButton(InSignal button); /// /// Проверяет, была ли кнопка нажата в начале текущего кадра. /// /// Пин кнопки на периферийной плате /// true только в первом кадре после нажатия кнопки public abstract bool GetButtonDown(InSignal button); /// /// Проверяет, была ли кнопка отпущена в начале текущего кадра. /// /// Пин кнопки на периферийной плате /// true только в первом кадре после отпускания кнопки public abstract bool GetButtonUp(InSignal button); //---------------------------------------------------------------------------------- /// /// Получает состояние кнопки по числовому индексу пина. /// Перегрузка для работы с системами, где количество пинов превышает размер перечисления. /// /// Числовой индекс пина (0-based) /// true если кнопка нажата в текущий момент public abstract bool GetButton(int pinIndex); /// /// Проверяет нажатие кнопки по числовому индексу пина в текущем кадре. /// /// Числовой индекс пина (0-based) /// true только в первом кадре после нажатия public abstract bool GetButtonDown(int pinIndex); /// /// Проверяет отпускание кнопки по числовому индексу пина в текущем кадре. /// /// Числовой индекс пина (0-based) /// true только в первом кадре после отпускания public abstract bool GetButtonUp(int pinIndex); //---------------------------------------------------------------------------------- /// /// Получает состояние игрового действия для любого из игроков. /// Используется для мультиплеерных сценариев где важно действие любого игрока. /// /// Абстрактное игровое действие /// true если действие активно у первого ИЛИ второго игрока public abstract bool GetButtonAnyPlayer(PlayerAction button); /// /// Проверяет начало игрового действия любым игроком в текущем кадре. /// /// Абстрактное игровое действие /// true если действие начато любым игроком в этом кадре public abstract bool GetButtonDownAnyPlayer(PlayerAction button); /// /// Проверяет завершение игрового действия любым игроком в текущем кадре. /// /// Абстрактное игровое действие /// true если действие завершено любым игроком в этом кадре public abstract bool GetButtonUpAnyPlayer(PlayerAction button); //---------------------------------------------------------------------------------- /// /// Получает состояние игрового действия для текущего активного игрока. /// Используется для одиночной игры или поочередного управления. /// /// Абстрактное игровое действие /// true если действие активно у текущего игрока public abstract bool GetButtonCurrentPlayer(PlayerAction button); /// /// Проверяет начало игрового действия текущим игроком в текущем кадре. /// /// Абстрактное игровое действие /// true если действие начато текущим игроком в этом кадре public abstract bool GetButtonDownCurrentPlayer(PlayerAction button); /// /// Проверяет завершение игрового действия текущим игроком в текущем кадре. /// /// Абстрактное игровое действие /// true если действие завершено текущим игроком в этом кадре public abstract bool GetButtonUpCurrentPlayer(PlayerAction button); public abstract bool AnyButton(); }