Передача ввода в конечный автомат (c #) - PullRequest
1 голос
/ 28 октября 2008

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

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

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 28 октября 2008

Если вы просто запрашиваете клавиатуру и мышь каждый тик, я могу гарантировать, что у вас возникнут проблемы. Когда вы запрашиваете каждый тик, вы обнаруживаете, что пропускаете входные данные, которые происходят быстро (во временной области одного тика). Представьте себе ситуацию, когда пользователь нажимает и отпускает клавишу / кнопку между двумя галочками (это произойдет больше, чем вы думаете) - вы полностью пропустите ввод.

Особенно в C #, который полностью предназначен для таких событий ввода, вы должны использовать события.

2 голосов
/ 28 октября 2008

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

1 голос
/ 28 октября 2008

В XNA они делают это, делая класс клавиатуры статическим.

KeyboardState state = Keyboard.GetState();

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

0 голосов
/ 28 октября 2008

Вы должны запускать события и фиксировать аргументы. Это был бы самый простой и эффективный способ справиться с этим.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...