Я постараюсь как можно лучше объяснить свой сценарий;
В каждом приложении галочка я запрашиваю текущее состояние клавиатуры и мыши и помещаю их в отдельные классы и структуры данных. Для клавиатуры это массив моего перечисления Ключи (по одному элементу для каждой из нажатых клавиш), а для мыши это класс, содержащий координаты дельты и логические значения для каждой нажатой кнопки.
У меня также есть элементарный конечный автомат, управляемый через класс диспетчера состояний, который поддерживает стек и упорядочивает состояния.
Все, что я хочу знать, - как лучше всего передать ввод (снимки) в отдельные состояния, в которых мое приложение может находиться в любой момент времени?
Я хотел бы обработать как можно больше входных данных отдельно от отдельных состояний, чтобы уменьшить повторяющуюся логику внутри состояний.
Или было бы лучше сохранить входные снимки как можно более чистыми и передать их состояниям, чтобы они могли скрыть свою логику, специфичную для входа?
Примечание
Эта структура похожа на то, как я представляю себе работу игры, и хотя это приложение не является игрой, его нужно обрабатывать как можно быстрее.





Почему вы запрашиваете состояние клавиатуры и мыши с каждым тиком? Гораздо лучшим и традиционным решением был бы захват событий, запускаемых с клавиатуры и мыши. Таким образом, вам нужно обновлять состояние только тогда, когда вам нужно.
В конце концов я получил делегат, передаваемый моему классу ввода, который вызывается только при событии. Ваше здоровье!
В XNA они делают это, делая класс клавиатуры статическим.
KeyboardState state = Keyboard.GetState();
затем вы можете получить доступ к текущему состоянию ключа с помощью приведенной выше строки кода.
Вы должны запускать события и фиксировать аргументы. Это был бы самый простой и эффективный способ справиться с этим.
class YourClass
{
//data members ...
public void OnKeyboardPress(object sender, EventArgs args)
{
//handle your logic capturing the state here
}
}
//elsewhere
someControl.KeyPress += new KeyPressDelegate(yourClassInstance.OnKeyboardPress);
Если вы будете просто запрашивать клавиатуру и мышь каждый раз, я могу гарантировать, что у вас возникнут проблемы. Когда вы запрашиваете каждый тик, вы обнаруживаете, что пропускаете вводимые данные, которые происходят быстро (во временной области одного тика). Представьте ситуацию, когда пользователь нажимает и отпускает клавишу / кнопку между двумя отметками (это произойдет чаще, чем вы думаете) - вы полностью пропустите ввод.
В частности, в C#, который полностью ориентирован на входные события, подобные этому, вы должны использовать события.
В настоящее время я работаю в этом направлении, поэтому буду держать вас в курсе, насколько хорошо это получается.