2012-02-22 12 views
0

J'ai une classe qui gère l'entrée au clavier et se déclenche KeyPressed, KeyReleased, ou KeyHeld événements. Il déclenche uniquement un événement si la clé existe dans la collection KeyBindings de mon composant Controller. Maintenant que j'ai tout ce travail, je suis coincé sur un problème. Ce que je veux est le suivant:Comment ajouter une fonction à une collection?

Key pressed. 

if(Key bind exists) 
    Fire key pressed event. 

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

Je ne peux juste pas comprendre comment la boucle de foreach fonctionnerait. Des idées sur comment je pourrais tirer quelque chose comme ça?


keyboardcontroller Composant:

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; } 
    } 
} 

C'est la classe qui contiendra les touches et leur fonction/délégué/événement/quelles que soient les liaisons. Le code pour les événements ne peut pas être contenu dans cette classe, car la classe est destinée uniquement à stocker des données. Je dois passer une liaison de clé et une action ou un ensemble d'actions à effectuer lorsque cette liaison est enfoncée.

Ajout d'une liaison:

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

Je ne sais pas comment faire la troisième ligne dans « Ajout d'une liaison: » travail.

+0

Vous cherchez juste pour la fonction d'événement intégré dans C#? http://msdn.microsoft.com/en-us/library/8627sbea.aspx –

+0

Non, je suis à la recherche de la fonctionnalité spécifique d'avoir une collection de fonctions/événements/quoi exécuter/déclencher quand un événement KeyPress particulier est mis à la porte. Je veux être capable de "coller" sur les événements à peu près à volonté. – Kittoes0124

+0

Je vois. J'ajoute une réponse avec une autre solution possible maintenant. –

Répondre

4

Vous pouvez utiliser un multicast delegate pour déclencher automatiquement plusieurs événements pour une clé donnée, de cette façon vous n'avez pas besoin de gérer une collection d'événements. Par exemple:

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

événements Accrochage:

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

Si pour une raison quelconque, vous ne souhaitez pas utiliser les délégués multicast, vous pouvez faire quelque chose comme ceci:

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

Plutôt que HashSet utilise un type de délégué réel tel que l'action <>. Par exemple:

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

Ok, cela ressemble à l'endroit où je veux aller. Maintenant, voici quelque chose que j'ai oublié de mentionner: l'événement à déclencher/la fonction à exécuter jusqu'à la touche NE PEUT PAS être définie dans le composant Contrôleur. Comment cela change-t-il comment je coderais ceci? – Kittoes0124

+0

Une option consiste à exposer des fonctions telles que AddKeyHandler (clé, gestionnaire d'actions). Je me demande, cependant, si le modèle de commande n'est pas plus ce que vous recherchez? – N8allan

+0

Il pourrait être, j'ai ajouté quelques détails plus haut pour vous donner une image plus claire de ce que je suis en train de faire. – Kittoes0124

2

Depuis C# a déléguer types comme des objets linguistiques de première classe, vous pouvez juste garder une collection de fonctions tout à fait directement

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

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

foreach (Action<KeyPressEventArgs> function in keyBinds) 
{ 
    function(args); 
} 
Questions connexes