2015-08-29 2 views
1

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

Так класс KeyboardHandler одноэлементно класса, И сейчас он имеет:
- делегировать недействительный KeyPressEventHandler()
- события этого делегата для клавиш со стрелками четыре
- статический экземпляр класса для одноточечного
- получить метод для этого экземпляра
- метод потоков while (true) и метод, который создает поток, который вызывает этот метод.

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

Я хочу, чтобы иметь возможность создать словарь <Keys, (event or whatever)>, так что я могу, например:

void doSomething() { } 
KeyboardHandler.Get().SubscribeToEvent(Keys.A, doSomething) 
void SubscribeToEvent(Keys key, Action toSubscribe) 
{ 
    this.KeypressHandler[key] += new KeypressEventHandler(tobSubscribe) 
} 

И метод, который будет обрабатывать стрельбы этих обработчиков событий, конечно.

Но как объявить такой словарь?

EDIT: в конце концов, здесь реализована: https://github.com/gioragutt/training/blob/master/MonoGameFirst/MonoGameFirst/BaseGameClasses/KeyboardHandler.cs

ответ

1

Просто объявить, что вы словарю как Dictionary<Keys, Action>. Тогда вам просто нужно проверить, действительно ли ваш словарь содержит этот ключ. Помните, что стандарт Action - это всего лишь метод, который имеет 0 входных аргументов и не возвращает значение. Если вам нужно, вы можете использовать одно из других действий, принимающих заданное количество входных аргументов. Ваш код может выглядеть примерно так:

Настройте ваш словарь:

var keyHandlers = new Dictionary<Keys, Action>(); 
keyHandlers.Add(Keys.Back,() => Console.WriteLine("Handler for backspace")); 
keyHandlers.Add(Keys.Enter,() => { 
    //some other statements, 
    //maybe set some class-level property 
    Console.WriteLine("Handler for enter "); 
}); 
keyHandlers.Add(3, NameOfMethodThatMatchesActionDelegateSignature); 

Затем в главном обработчике события, проверьте словарь и попытаться сделать материал:

Action actionToDo; 
bool actionRegistered = keyHandlers.TryGetValue(key, out actionToDo); 
if (actionRegistered) 
{ 
    actionToDo.Invoke(); 
} 

A demo, который использует Интс для регистрации действий вместо перечисления Keys.

+1

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

+0

Разум рассматривает мою часть кода здесь? https://github.com/gioragutt/training/blob/master/MonoGameFirst/MonoGameFirst/BaseGameClasses/KeyboardHandler.cs –

+0

@GioraGuttsait Я не очень разбираюсь в обзоре кода. Но если ваш код теперь работает, и у вас есть некоторые конкретные вопросы (например, эффективность, масштабируемость и т. Д.), Вы можете задать вопрос о [Code Review] (http://codereview.stackexchange.com/). Обязательно прочитайте их руководства по теме, но это более подходящее место, чтобы спросить. Вы получите больше глаз от людей, действительно посвященных обзору кода. – ryanyuyu