Передача ввода в конечный автомат (C#)

Я постараюсь как можно лучше объяснить свой сценарий;

В каждом приложении галочка я запрашиваю текущее состояние клавиатуры и мыши и помещаю их в отдельные классы и структуры данных. Для клавиатуры это массив моего перечисления Ключи (по одному элементу для каждой из нажатых клавиш), а для мыши это класс, содержащий координаты дельты и логические значения для каждой нажатой кнопки.

У меня также есть элементарный конечный автомат, управляемый через класс диспетчера состояний, который поддерживает стек и упорядочивает состояния.

Все, что я хочу знать, - как лучше всего передать ввод (снимки) в отдельные состояния, в которых мое приложение может находиться в любой момент времени?

Я хотел бы обработать как можно больше входных данных отдельно от отдельных состояний, чтобы уменьшить повторяющуюся логику внутри состояний.

Или было бы лучше сохранить входные снимки как можно более чистыми и передать их состояниям, чтобы они могли скрыть свою логику, специфичную для входа?

Примечание
Эта структура похожа на то, как я представляю себе работу игры, и хотя это приложение не является игрой, его нужно обрабатывать как можно быстрее.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 108
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Почему вы запрашиваете состояние клавиатуры и мыши с каждым тиком? Гораздо лучшим и традиционным решением был бы захват событий, запускаемых с клавиатуры и мыши. Таким образом, вам нужно обновлять состояние только тогда, когда вам нужно.

В настоящее время я работаю в этом направлении, поэтому буду держать вас в курсе, насколько хорошо это получается.

Adam Naylor 28.10.2008 19:11

В конце концов я получил делегат, передаваемый моему классу ввода, который вызывается только при событии. Ваше здоровье!

Adam Naylor 29.10.2008 17:12

В 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#, который полностью ориентирован на входные события, подобные этому, вы должны использовать события.

Другие вопросы по теме