2012-02-22 5 views
0

키보드 입력을 관리하는 클래스가 있으며 KeyPressed, KeyReleased 또는 KeyHeld 이벤트가 발생합니다. 키가 내 컨트롤러 구성 요소의 KeyBindings 컬렉션에있는 경우에만 이벤트를 발생시킵니다. 이제는 모든 작업이 문제에 봉착했습니다. 내가 원하는 것은 다음과 같습니다 :컬렉션에 함수를 추가하려면 어떻게합니까?

Key pressed. 

if(Key bind exists) 
    Fire key pressed event. 

foreach(function in keyBinds) 
{ 
    execute function, fire event, whatever... 
} 

foreach 루프가 어떻게 작동하는지 알 수 없습니다. 어떻게 이런 식으로 끌어낼 수 있을지에 대한 아이디어가 있습니까?


KeyboardController 구성 요소 :

public class KeyboardController : IComponent 
{ 
    //Fields 
    private Dictionary<Keys, HashSet<Delegate>> m_keyBindings = new Dictionary<Keys,HashSet<Delegate>>(); 

    //Properties 
    public Dictionary<Keys, HashSet<Delegate>> KeyBindings 
    { 
     get { return m_keyBindings; } 
    } 
} 

이는 키와 그 기능/대표/이벤트/어떤 바인딩을 포함하는 클래스입니다. 클래스는 데이터를 저장하기위한 것이기 때문에 이벤트 코드는이 클래스 내에 포함될 수 없습니다. 이 바인딩을 누를 때 수행 할 키 바인딩과 작업 또는 동작 집합을 전달해야합니다.

바인딩을 추가 : 작업 :

//Set key bindings 
KeyboardController kbController = entityManager.GetComponent<KeyboardController>(1); 
kbController.KeyBindings.Add(Keys.Up, new HashSet<Delegate>()); 
kbController.KeyBindings[Keys.Up].Add(function); 

내가 "바인딩을 추가"에서 세 번째 줄을 만드는 방법을 알고하지 않습니다.

+0

기능의 컬렉션을 유지할 수 있습니다 기음#? http://msdn.microsoft.com/en-us/library/8627sbea.aspx –

+0

아니요, 특정 KeyPress 이벤트가 실행될 때 함수/이벤트/실행/실행의 컬렉션이있는 특정 기능을 찾고 있습니다. 해고 됐어. 저는 의지할만한 이벤트를 "할 수있게"하고 싶습니다. – Kittoes0124

+0

나는 본다. 다른 가능한 해결책을 가진 대답을 추가하고 있습니다. –

답변

4

multicast delegate을 사용하면 주어진 키에 대해 자동으로 여러 이벤트를 실행할 수 있습니다. 이렇게하면 이벤트 모음을 유지 관리 할 필요가 없습니다.

Dictionary<Key, Action> bindings = ... 
Action binding; 
if (binding.TryGetValue(key, out binding)) 
    binding(); // this will execute multiple events if they are hooked 

후킹 이벤트 : 예를 들어

bindings[Keys.A] += new Action(MyAKeyHandler); 

멀티 캐스트 위임을 사용하지 않은 어떤 이유로, 당신은 같은 것을 할 수있는 경우 :

List<Action> handlers = binding[key]; 
... 
if (handlers != null) 
    foreach (var handler in handlers) 
    handler(); 

보다는를 HashSet은 액션 <>과 같은 실제 대리자 유형을 사용합니다. 예를 들어 : C#을 처음 수준의 언어 객체로 유형을 위임가

Dictionary<Keys, Action> handlers = ... 
handlers[key] += function; 
+0

좋아, 내가 가고 싶은 곳처럼 들린다. 자, 내가 여기서 언급하는 것을 잊어 버린 것입니다 : 해고 될 이벤트/키 누름 위로 실행될 기능은 컨트롤러 구성 요소에서 정의 될 수 없습니다. 이게 어떻게 코드화할까요? – Kittoes0124

+0

하나의 옵션은 AddKeyHandler (키 키, 액션 핸들러)와 같은 기능을 노출하는 것입니다. 그러나 커맨드 패턴이 당신이 찾고있는 것이 아니라면 궁금합니다. – N8allan

+0

아마도 내가하는 일에 대해보다 명확한 그림을 제공하기 위해 더 자세한 내용을 추가했습니다. – Kittoes0124

2

때문에, 당신은 당신이 바로 내장 된 이벤트 기능에서 찾고 계십니까 매우 직접

var keyBinds = new List<Action<KeyPressEventArgs>>(); 

KeyPressEventArgs args = /* Something from the actual keypress event */; 

foreach (Action<KeyPressEventArgs> function in keyBinds) 
{ 
    function(args); 
} 
관련 문제